如何在C#中实现异步方法的取消?
时间: 2024-09-11 14:06:29 浏览: 22
在C#中,实现异步方法的取消通常是通过结合`CancellationToken`类和`CancellationTokenSource`类来完成的。`CancellationTokenSource`用来创建一个取消令牌,并控制何时取消操作。`CancellationToken`则被传递到异步方法中,用于监测取消请求。以下是如何实现的步骤:
1. 创建`CancellationTokenSource`实例。
2. 在异步方法中,将`CancellationToken`作为参数传入。
3. 在执行异步任务的过程中,定期检查`CancellationToken`的`IsCancellationRequested`属性,以确定是否收到了取消请求。
4. 如果检测到取消请求,可以通过抛出`OperationCanceledException`来响应取消,或者执行必要的清理工作。
5. 在调用异步方法的地方,调用`CancellationTokenSource.Cancel`方法来发出取消请求。
下面是一个简单的示例代码:
```csharp
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using (var cts = new CancellationTokenSource())
{
var token = cts.Token;
try
{
await CallAsync(token);
Console.WriteLine("任务完成。");
}
catch (OperationCanceledException)
{
Console.WriteLine("任务被取消。");
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
static async Task CallAsync(CancellationToken cancellationToken)
{
for (int i = 0; i < 10; i++)
{
if (cancellationToken.IsCancellationRequested)
{
throw new OperationCanceledException(cancellationToken);
}
Console.WriteLine($"任务执行中... {i + 1}/10");
await Task.Delay(1000); // 模拟耗时操作
}
}
}
```
在上述代码中,如果用户按下任意键,`Main`方法中的`cts.Cancel()`将会被调用,这将设置`CancellationToken`的`IsCancellationRequested`为`true`,进而导致`CallAsync`方法抛出`OperationCanceledException`。