using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 创建一个 CancellationTokenSource 实例
using (var cts = new CancellationTokenSource())
{
// 启动一个长时间运行的任务
Task longRunningTask = Task.Run(() =>
{
// 假设这是一个长时间运行的操作
for (int i = 0; i < 100; i++)
{
if (cts.Token.IsCancellationRequested)
{
Console.WriteLine("Operation cancelled!");
return; // 退出循环
}
Thread.Sleep(100); // 模拟耗时操作
Console.WriteLine($"Step {i}");
}
}, cts.Token); // 将 CancellationToken 传递给 Task.Run
// 等待一段时间,然后请求取消
await Task.Delay(5000); // 等待5秒
cts.Cancel(); // 发送取消请求
try
{
// 等待长时间运行的任务完成
await longRunningTask;
}
catch (OperationCanceledException ex)
{
Console.WriteLine(ex.Message); // 处理取消操作
}
}
}
}
解析:
关键点
-
创建 CancellationTokenSource:使用
new CancellationTokenSource()
创建一个实例。 -
传递 CancellationToken:将
CancellationTokenSource
的Token
属性传递给需要支持取消的操作,例如Task.Run
、Task.Factory.StartNew
或其他接受CancellationToken
的 API。 -
请求取消:在适当的时候调用
CancellationTokenSource
的Cancel
方法来请求取消操作。 -
检查取消:在长时间运行的操作中,定期检查
CancellationToken.IsCancellationRequested
属性,以判断是否已请求取消操作。 -
处理取消:如果检测到取消请求,则适当地停止操作,并可能抛出
OperationCanceledException
异常(尽管这不是强制性的,具体取决于你的应用场景)。 -
使用 using 语句:使用
using
语句来确保CancellationTokenSource
被正确释放,这有助于避免内存泄漏。