服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#使用CancellationTokenSource 取消 Task的方法

C#使用CancellationTokenSource 取消 Task的方法

2022-12-29 13:58White_Hacker C#

因为涉及到了日常经常会碰到的取消任务操作,本文主要介绍了C#使用CancellationTokenSource 取消 Task,文中通过代码介绍的非常详细,感兴趣的可以了解一下

本篇的内容也很重要,因为涉及到了日常经常会碰到的取消任务操作。

从我个人了解到的情况,基本上大家都采用CancellationTokenSource方法来取消任务,因此这里就举几个简单的例子。例子依然是来自于《C#多线程编程实战》。

?
1
2
3
4
5
6
7
8
9
10
11
private static int TaskMethod(string name, int seconds, CancellationToken token)
{
Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
for (int i = 0; i < seconds; i ++)
{
Thread.Sleep(1000);
if (token.IsCancellationRequested) return -1;
}
return 42*seconds;
}

Task的取消采用一种形如令牌(Token)的方式。首先先构建一个CancellationTokenSource实例,而后在需要调用的操作(函数)参数中添加一个CancellationToken参数,也就是说, 取消是要求增加函数参数的。以上TaskMethod方法中可以看出,函数使用循环检查的方式来检测在seconds秒内,外部是否下达取消指令。当IsCancellationRequested时,那么将会返回-1.

接下来,先看一下如果Task没有被运行就直接取消,会发生什么。

?
1
2
3
4
5
6
var cts = new CancellationTokenSource();
var longTask = new Task<int>(() => TaskMethod("Task 1", 10, cts.Token), cts.Token);
Console.WriteLine("取消前,第一个任务的状态:{0}", longTask.Status);
cts.Cancel(); //取消任务!
Console.WriteLine("取消后,第一个任务的状态:{0}",longTask.Status);
Console.WriteLine("第一个任务在被执行前就已经取消了!");

C#使用CancellationTokenSource 取消 Task的方法

接下来,我们来看看start()后再cancel()的情况。示例中每隔半秒打印一下longTask的状态:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var cts = new CancellationTokenSource();
var longTask = new Task<int>(() => TaskMethod("Task 2", 10, cts.Token), cts.Token);
longTask.Start(); //启动任务
for (int i = 0; i < 5; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine(longTask.Status);
}
cts.Cancel();
for (int i = 0; i < 5; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine(longTask.Status);
}
 
Console.WriteLine("A task has been completed with result {0}.", longTask.Result);

C#使用CancellationTokenSource 取消 Task的方法

特别需要说明的是,在cancel了以后,任务状态显示为RanToCompletion,这是因为从TPL的视角看,这个任务虽然取消了,但是它正常完成了工作并且返回了-1.

到此这篇关于C#使用CancellationTokenSource 取消 Task的方法的文章就介绍到这了,更多相关C# 取消 Task内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/huiwuhuiwu/article/details/53579328

延伸 · 阅读

精彩推荐
  • C#基于C#调用OCX控件的常用方法(推荐)

    基于C#调用OCX控件的常用方法(推荐)

    下面小编就为大家分享一篇基于C#调用OCX控件的常用方法推荐,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    愣愣OMG5692022-02-15
  • C#浅谈C#各种数组直接的数据复制/转换

    浅谈C#各种数组直接的数据复制/转换

    下面小编就为大家带来一篇浅谈C#各种数组直接的数据复制/转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网10372021-12-06
  • C#C#使用Socket实现本地多人聊天室

    C#使用Socket实现本地多人聊天室

    这篇文章主要为大家详细介绍了C#使用Socket实现本地多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    .roughbonbon7652022-12-25
  • C#C# AE之返回上一级和下一级的实战操作

    C# AE之返回上一级和下一级的实战操作

    这篇文章主要介绍了C# AE之返回上一级和下一级的实战操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    南方北先生11282022-10-27
  • C#Devexpress treelist 简介

    Devexpress treelist 简介

    本文给大家简单介绍了Devexpress treelist 知识,包括属性列表,事件及使用方法,非常不错,具有参考借鉴价值,需要的朋友参考下...

    一枚水8842021-12-16
  • C#C#与java TCP通道加密通信实例

    C#与java TCP通道加密通信实例

    这篇文章主要介绍了C#与java TCP通道加密通信,文章通过真实的案例详细讲解说明C#与java TCP通道加密通信的相关资料,需要的小伙伴可以参考一下...

    我打农村来7262022-12-07
  • C#C#根据日期计算星期几的实例代码

    C#根据日期计算星期几的实例代码

    本示例采用基姆拉尔森计算公式来根据日期计算未来日子是星期几。对基姆拉尔森计算公式不清楚的朋友可以先看下计算公式哦。本文分为客户端和服务的...

    Mr.Bruce4362021-12-03
  • C#C#通过html调用WinForm的方法

    C#通过html调用WinForm的方法

    这篇文章主要介绍了C#通过html调用WinForm的方法,涉及html页面中使用JavaScript访问C#的相关技巧,需要的朋友可以参考下...

    且行且思8232021-11-18