温馨提示×

c# startcoroutine 如何处理协程取消

c#
小樊
81
2024-11-29 00:24:26
栏目: 编程语言

在C#中,使用asyncawait关键字可以轻松地创建和管理协程。但是,在某些情况下,您可能需要取消正在运行的协程。为了处理协程取消,您可以使用CancellationTokenTask类。

以下是一个简单的示例,说明如何在C#中处理协程取消:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建一个CancellationTokenSource
        CancellationTokenSource cts = new CancellationTokenSource();

        // 将CancellationToken传递给协程
        Task task = DoWorkAsync(cts.Token);

        // 在5秒后取消协程
        cts.CancelAfter(5000);

        try
        {
            // 等待协程完成,或者捕获取消异常
            await task;
        }
        catch (AggregateException ae)
        {
            // 如果协程被取消,ae.InnerException将包含OperationCanceledException
            if (ae.InnerException is OperationCanceledException)
            {
                Console.WriteLine("协程被取消");
            }
            else
            {
                Console.WriteLine("协程发生错误");
            }
        }
    }

    static async Task DoWorkAsync(CancellationToken cancellationToken)
    {
        for (int i = 0; i < 10; i++)
        {
            // 检查cancellationToken是否已取消
            cancellationToken.ThrowIfCancellationRequested();

            Console.WriteLine($"正在处理任务 {i}");

            // 模拟耗时操作
            await Task.Delay(1000);
        }
    }
}

在这个示例中,我们创建了一个CancellationTokenSource,并将其传递给DoWorkAsync协程。我们还设置了一个5秒的定时器,以便在5秒后取消协程。

DoWorkAsync协程中,我们使用cancellationToken.ThrowIfCancellationRequested()方法检查是否已请求取消。如果已请求取消,我们将引发OperationCanceledException异常。在Main方法中,我们使用try-catch块捕获AggregateException异常,并检查其内部异常是否为OperationCanceledException。如果是,则表示协程已被取消。

0