在C#中,使用async
和await
关键字可以轻松地创建和管理协程。但是,在某些情况下,您可能需要取消正在运行的协程。为了处理协程取消,您可以使用CancellationToken
和Task
类。
以下是一个简单的示例,说明如何在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
。如果是,则表示协程已被取消。