在.NET中,CancellationTokenSource、CancellationToken和Task是处置惩罚异步操纵和取消任务的紧张工具。本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。
CancellationTokenSource
CancellationTokenSource 是一个取消操纵的触发器。它用于生成和管理CancellationToken,并控制取消信号的发出。
常用属性和方法
- Token: 返回一个与此源关联的CancellationToken。
- Cancel(): 触发取消操纵。
- CancelAfter(milliseconds): 指定时间后触发取消操纵。
- Dispose(): 释放资源。
示例
- var cts = new CancellationTokenSource();
- CancellationToken token = cts.Token;
- Task.Run(() => {
- for (int i = 0; i < 10; i++)
- {
- if (token.IsCancellationRequested)
- {
- Console.WriteLine("Task canceled");
- break;
- }
- Console.WriteLine($"Task running: {i}");
- Thread.Sleep(500);
- }
- });
- Thread.Sleep(2000);
- cts.Cancel();
复制代码 CancellationToken
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 < 10; i++)
- {
- token.ThrowIfCancellationRequested();
- Console.WriteLine($"Task running: {i}");
- Thread.Sleep(500);
- }
- }
- catch (OperationCanceledException)
- {
- Console.WriteLine("Task was canceled");
- }
- });
- Thread.Sleep(2000);
- cts.Cancel();
复制代码 Task与CancellationToken
Task 是.NET中的异步操纵单元。团结CancellationToken可以在任务运行时取消它。
示例:取消任务
- var cts = new CancellationTokenSource();
- CancellationToken token = cts.Token;
- Task task = Task.Run(() => {
- for (int i = 0; i < 10; i++)
- {
- if (token.IsCancellationRequested)
- {
- Console.WriteLine("Task canceled");
- break;
- }
- Console.WriteLine($"Task running: {i}");
- Thread.Sleep(500);
- }
- }, token);
- Thread.Sleep(2000);
- cts.Cancel();
- try
- {
- task.Wait();
- }
- catch (AggregateException ex)
- {
- foreach (var inner in ex.InnerExceptions)
- {
- if (inner is TaskCanceledException)
- {
- Console.WriteLine("Task cancellation exception caught");
- }
- }
- }
复制代码 示例:带超时的任务
- var cts = new CancellationTokenSource(3000); // 3秒后自动取消
- CancellationToken token = cts.Token;
- Task.Run(() => {
- try
- {
- for (int i = 0; i < 10; 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可以处置惩罚取消时的回调逻辑。
通过灵活运用这些工具,你可以编写更高效、可控的异步程序。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |