cancellationtoken通过cancellationtokensource和cancellationtoken实现协作式取消机制,前者发出取消信号,后者传递给异步任务监听信号;2. 创建cancellationtokensource并获取其token,将token传入异步方法,在任务中通过throwifcancellationrequested或iscancellationrequested检查取消请求,并在task.delay等异步操作中传入token以响应取消;3. 调用cancellationtokensource的cancel方法可触发所有关联任务的取消,cancelafter可设置延迟自动取消;4. 多个并发任务可共享同一cancellationtoken,实现集中取消控制;5. 使用using语句或try-finally确保cancellationtokensource被正确dispose,防止资源泄漏;6. 异步任务应捕获operationcanceledexception并执行清理操作,确保取消过程安全完整。

使用
CancellationToken
解决方案:
CancellationToken的核心在于
CancellationTokenSource
CancellationToken
CancellationTokenSource
CancellationToken
创建 CancellationTokenSource
CancellationTokenSource cts = new CancellationTokenSource();
获取 CancellationToken
CancellationToken token = cts.Token;
将 CancellationToken
async Task MyAsyncTask(CancellationToken cancellationToken)
{
try
{
for (int i = 0; i < 100; i++)
{
// 检查是否已请求取消
cancellationToken.ThrowIfCancellationRequested();
// 执行一些工作
Console.WriteLine($"Task running: {i}");
await Task.Delay(100, cancellationToken); // 异步等待,并监听取消信号
}
Console.WriteLine("Task completed successfully.");
}
catch (OperationCanceledException)
{
Console.WriteLine("Task cancelled.");
}
}启动异步任务:
Task task = MyAsyncTask(token);
请求取消:
cts.Cancel(); // 发出取消信号
关键点在于
cancellationToken.ThrowIfCancellationRequested()
Task.Delay(..., cancellationToken)
OperationCanceledException
OperationCanceledException
异步任务应该捕获
OperationCanceledException
CancellationTokenSource的CancelAfter方法可以在指定时间后自动取消任务。
CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); // 5秒后自动取消
CancellationToken
async/await
CancellationToken
CancellationToken与Task.Run结合使用时,需要特别注意。Task.Run会将任务调度到线程池,而线程池线程是后台线程。如果主线程退出,后台线程可能会被强制终止,导致未处理的异常。
CancellationTokenSource的Token属性是一个只读属性,这意味着一旦创建,就不能更改与特定任务关联的CancellationToken。 如果需要为同一任务创建新的取消令牌,则必须创建新的CancellationTokenSource。
CancellationToken如何处理多个并发任务?
对于多个并发任务,可以为每个任务传递同一个
CancellationToken
CancellationTokenSource.Cancel()
CancellationToken
CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken token = cts.Token; Task task1 = MyAsyncTask(token); Task task2 = MyAsyncTask(token); // ... 一段时间后 cts.Cancel(); // 同时取消 task1 和 task2
需要注意的是,每个任务都需要正确地处理
OperationCanceledException
CancellationToken的IsCancellationRequested属性有什么用?
IsCancellationRequested
async Task MyAsyncTask(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
// 执行一些工作
Console.WriteLine("Task running...");
await Task.Delay(100);
// 检查是否已请求取消,并执行清理工作
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Cancellation requested. Cleaning up...");
// 执行清理操作
break;
}
}
Console.WriteLine("Task finished.");
}使用
IsCancellationRequested
如何处理CancellationTokenSource的Dispose?
CancellationTokenSource
IDisposable
Dispose()
可以使用
using
CancellationTokenSource
using (CancellationTokenSource cts = new CancellationTokenSource())
{
CancellationToken token = cts.Token;
Task task = MyAsyncTask(token);
// ... 一段时间后
cts.Cancel();
await task;
} // cts.Dispose() 会在这里被自动调用如果不使用
using
Dispose()
CancellationTokenSource cts = new CancellationTokenSource();
try
{
CancellationToken token = cts.Token;
Task task = MyAsyncTask(token);
// ... 一段时间后
cts.Cancel();
await task;
}
finally
{
cts.Dispose();
}无论哪种方式,都要确保
Dispose()
Dispose()
以上就是C#的CancellationToken如何取消异步任务?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号