C# 组合CancellationTokenSource的使用

前言

在异步编程中,经常需要使用CancellationToken来取消任务的执行。

但是通常情况下,一个耗时任务还需要有超时机制。那个如何让一个任务既可以超市自动取消也可以手动取消?

组合CancellationTokenSourced的使用

csharp 复制代码
//创建两个cts(一个手动取消,一个超时取消)
CancellationTokenSource cancellCts= new CancellationTokenSource();
CancellationTokenSource timeOutCts = new CancellationTokenSource(1000);
//将两个cts组合
CancellationTokenSource compositeCts = CancellationTokenSource.CreateLinkedTokenSource(cancellCts.Token, timeOutCts.Token);
try
{
	//执行异步耗时任务
	await DoLongTimeTask(compositeCts.Token)
}
catch (OperationCanceledException)
{
    if (cancellCts.Token.IsCancellationRequested)
    {   
    	//手动取消 
        throw new OperationCanceledException();
    }
    else if (timeOutCts.Token.IsCancellationRequested)
    {
    	//超时取消
        throw new TimeoutException();
    }
}
finally
{
	cancellCts.Dispose();
   timeOutCts.Dispose();
   compositeCts.Dispose();
}
相关推荐
自己的九又四分之三站台41 分钟前
基于OpenCV扶正扫描文件
人工智能·opencv·计算机视觉·c#
FuckPatience1 小时前
C# 获取属性自定义特性报错:System.NotSupportedException:“泛型类型无效。
c#
秋月的私语2 小时前
Windows Forms 多语言开发指南
windows·c#·form
张3蜂2 小时前
runtimes\win-AnyCPU\native\DlibDotNetNativeDnnAgeClassification.dll”,原因是找不到该文件
c#
aini_lovee2 小时前
基于C# 和 NModbus 库的 Modbus TCP 通信示例源码
开发语言·tcp/ip·c#
HUST2 小时前
C 语言 第八讲:VS实用调试技巧
运维·c语言·开发语言·数据结构·算法·c#
CreasyChan2 小时前
Unity UniRx Observable 类详解及使用
游戏·unity·c#·游戏引擎
jllllyuz3 小时前
C# 面向对象图书管理系统
android·开发语言·c#
wuguan_3 小时前
C#文件读取
开发语言·c#·数据读写