如何在C#中正确处理已取消的`CancellationToken`?
时间: 2024-09-07 18:02:04 浏览: 47
在 C# 中,`CancellationToken` 是用于异步操作的取消请求的一种机制。当你需要在任务执行过程中提供一个可以中断它的信号时,会使用到它。当 `CancellationToken` 被标记为已取消 (`IsCancellationRequested == true`),你应该按照以下几个步骤处理:
1. **检查标记**:
在你的异步方法开始时,检查 `token.IsCancellationRequested`,如果为真,则表示已经被取消。
```csharp
if (cancellationToken.IsCancellationRequested)
{
// 已经取消,采取相应行动
}
```
2. **取消内部操作**:
如果你在执行其他异步操作,比如调用另一个任务或网络请求,也需要取消它们:
```csharp
task = Task.Run(() => SomeLongRunningOperation(token));
task.CancellationToken.Register(() => task.TrySetCanceled());
```
3. **提前完成或抛出异常**:
你可以选择终止当前的操作并返回,或者抛出 `OperationCanceledException`,这样可以通知调用者任务已被取消。
```csharp
try
{
await SomeAsyncTask(token);
}
catch (OperationCanceledException)
{
// 操作被取消,记录日志或清理资源
}
```
4. **避免死锁**:
避免在一个同步阻塞的操作中直接检查并取消令牌,因为这可能会导致死锁。应该先将取消标志存储起来,在操作完成后处理。
```csharp
var cancelled = false;
await Task.Run(() =>
{
if (token.IsCancellationRequested)
{
cancelled = true;
}
else
{
// 执行耗时操作...
}
});
if (cancelled)
{
// 已经取消,处理
}
```
阅读全文