English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 6|回复: 0

C#中 Task 结合 CancellationTokenSource的妙用

[复制链接]
查看: 6|回复: 0

C#中 Task 结合 CancellationTokenSource的妙用

[复制链接]
查看: 6|回复: 0

379

主题

0

回帖

1147

积分

金牌会员

积分
1147
wsz

379

主题

0

回帖

1147

积分

金牌会员

积分
1147
2025-2-7 01:06:10 | 显示全部楼层 |阅读模式
在.NET中,CancellationTokenSourceCancellationTokenTask是处理异步操作和取消任务的重要工具。本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。
<hr>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可以处理取消时的回调逻辑。
通过灵活运用这些工具,你可以编写更高效、可控的异步程序。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

379

主题

0

回帖

1147

积分

金牌会员

积分
1147

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 15:51 , Processed in 0.729904 second(s), 27 queries .

Powered by 智能设备

©2025

|网站地图