摘要:在.NET中,CancellationTokenSource、CancellationToken和Task是处理异步操作和取消任务的重要工具。
在.NET中,CancellationTokenSource、CancellationToken和Task是处理异步操作和取消任务的重要工具。
本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。
CancellationTokenSource是一个取消操作的触发器。
它用于生成和管理CancellationToken,并控制取消信号的发出。
常用属性和方法Token
: 返回一个与此源关联的CancellationToken。
Cancel
: 触发取消操作。
CancelAfter(milliseconds)
: 指定时间后触发取消操作。
Dispose
: 释放资源。
示例var cts = new CancellationtokenSource;CancellationToken token = cts.Token;Task.Run( => { for (int i = 0; i { if (token.IsCancellationRequested) { Console.WriteLine("Task canceled"); break; } Console.WriteLine($"Task running: {i}"); Thread.Sleep(500); }});Thread.Sleep(2000);cts.Cancel;CancellationToken是用于传播取消请求的轻量级结构。它由CancellationTokenSource生成。常用属性和方法IsCancellationRequested
: 是否收到取消请求。
ThrowIfCancellationRequested
: 如果已请求取消,抛出OperationCanceledException。
Register(Action)
: 注册一个取消时触发的回调。
示例var cts = new CancellationTokenSource;CancellationToken token = cts.Token;Task.Run( => { token.Register( => Console.WriteLine("Cancellation registered")); try { for (int i = 0; i { token.ThrowIfCancellationRequested; Console.WriteLine($"Task running: {i}"); Thread.Sleep(500); } } catch (OperationCanceledException) { Console.WriteLine("Task was canceled"); }});Thread.Sleep(2000);cts.Cancel;Task是.NET中的异步操作单元。结合CancellationToken可以在任务运行时取消它。示例:取消任务var cts = new CancellationTokenSource;CancellationToken token = cts.Token;Task task = Task.Run( => { for (int i = 0; i { if (token.IsCancellationRequested) { Console.WriteLine("Task canceled"); break; } Console.WriteLine($"Task running: {i}"); Thread.Sleep(500); }}, token);Thread.Sleep(2000);cts.Cancel;示例:带超时的任务var cts = new CancellationTokenSource(3000); // 3秒后自动取消CancellationToken token = cts.Token;Task.Run( => { try { for (int i = 0; i { token.ThrowIfCancellationRequested; Console.WriteLine($"Task running: {i}"); Thread.Sleep(1000); } } catch (OperationCanceledException) { Console.WriteLine("Task canceled due to timeout"); }});使用CancellationTokenSource来控制取消。
通过CancellationToken将取消信号传递给任务或方法。
任务中可以通过ThrowIfCancellationRequested或检查IsCancellationRequested响应取消请求。
合理使用Register可以处理取消时的回调逻辑。
通过灵活运用这些工具,你可以编写更高效、可控的异步程序。
来源:opendotnet
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!