在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
被請求取消時拋出的異常。這樣,我們可以優雅地處理取消操作,而不是讓整個程序崩潰。