在C#中,ConfigureAwait
方法用于控制异步方法的执行上下文。当你在一个异步方法中使用await
关键字时,它会捕获当前的同步上下文并在完成后恢复该上下文。但是,在某些情况下,你可能需要取消正在进行的异步操作。
要处理异步方法的取消,你可以使用CancellationToken
。CancellationToken
允许你向异步方法传递取消请求,以便在操作完成之前停止执行。以下是如何在异步方法中使用CancellationToken
和ConfigureAwait
来处理取消请求的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// 启动异步任务并传递CancellationToken
Task task = DoAsyncWork(token);
// 在5秒后取消任务
await Task.Delay(5000);
cts.Cancel();
try
{
// 等待任务完成,包括处理取消
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("任务被取消。");
}
}
static async Task DoAsyncWork(CancellationToken cancellationToken)
{
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
// 检查是否已取消
cancellationToken.ThrowIfCancellationRequested();
// 模拟长时间运行的操作
Thread.Sleep(1000);
// 使用 ConfigureAwait 处理取消
if (cancellationToken.IsCancellationRequested)
{
return;
}
Console.WriteLine($"完成 {i} 次迭代。");
}
}, cancellationToken);
}
}
在这个示例中,我们创建了一个CancellationTokenSource
并向其传递了一个CancellationToken
。然后,我们将此令牌传递给DoAsyncWork
方法。在DoAsyncWork
方法中,我们使用Task.Run
来执行长时间运行的操作,并在每次迭代时检查CancellationToken
是否已请求取消。如果已请求取消,我们立即返回,从而停止执行异步操作。
注意,在Main
方法中,我们使用try-catch
块来捕获OperationCanceledException
,这是当CancellationToken
被请求取消时抛出的异常。这样,我们可以优雅地处理取消操作,而不是让整个程序崩溃。