做一个bool变量和CancellationTokenSource 有什么区别
时间: 2024-08-17 11:02:42 浏览: 61
在.NET Framework中,`CancellationTokenSource` 和布尔类型的 `bool` 变量用于管理异步操作的取消行为有所不同。
`CancellationTokenSource` 是一种专门设计用来创建和管理 `CancellationToken` 对象的对象。它允许你在运行时暂停或取消一个任务。当你调用 `CancellationTokenSource.Cancel()` 或者当外部源取消该令牌(例如,通过另一个 `CancellationTokenSource`)时,这个令牌就会设置为 `IsCancellationRequested` 属性为 `true`。这使得你可以在线程安全的方式检查任务是否已被取消,并在适当的时候采取相应措施,如停止正在进行的操作。
相比之下,一个简单的 `bool` 变量通常用于标记某个条件是否满足,比如一个开关状态。它并不直接关联到一个正在运行的任务,也不具备自动中断任务的能力。要使用布尔变量来控制异步任务,你需要自己编写逻辑去检查这个变量并手动决定何时停止任务。
下面的示例展示了这两种方式的区别:
1. 使用 `CancellationTokenSource`[^1]:
```csharp
var source = new CancellationTokenSource();
// 当需要取消任务时,调用source.Cancel()
if (source.IsCancellationRequested)
{
Console.WriteLine("Task was cancelled.");
}
else
{
// 进行耗时操作...
}
// 注册取消后执行的清理逻辑
source.Token.Register(() =>
{
Console.WriteLine("Cleaning up after cancellation...");
});
```
2. 使用布尔变量:
```csharp
bool isCancelled = false;
async Task MyAsyncTask()
{
while (!isCancelled)
{
await Task.Delay(100);
Console.WriteLine("Task running...");
}
Console.WriteLine("Task cancelled by flag change.");
}
// 外部可以随时改变isCancelled的值以取消任务
isCancelled = true;
await MyAsyncTask();
```
阅读全文