Task 结合 CancellationTokenSource的妙用

摘要:在.NET中,CancellationTokenSource、CancellationToken和Task是处理异步操作和取消任务的重要工具。

在.NET中,CancellationTokenSourceCancellationTokenTask是处理异步操作和取消任务的重要工具。

本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。

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

相关推荐