返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#使用CancellationTokenSource取消Task的方法
  • 161
分享到

C#使用CancellationTokenSource取消Task的方法

2024-04-02 19:04:59 161人浏览 薄情痞子
摘要

本篇的内容也很重要,因为涉及到了日常经常会碰到的取消任务操作。 从我个人了解到的情况,基本上大家都采用CancellationTokenSource方法来取消任务,因此这里就举几个简

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

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

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没有被运行就直接取消,会发生什么。

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("第一个任务在被执行前就已经取消了!");

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

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);

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

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

--结束END--

本文标题: C#使用CancellationTokenSource取消Task的方法

本文链接: https://lsjlt.com/news/139076.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#使用CancellationTokenSource取消Task的方法
    本篇的内容也很重要,因为涉及到了日常经常会碰到的取消任务操作。 从我个人了解到的情况,基本上大家都采用CancellationTokenSource方法来取消任务,因此这里就举几个简...
    99+
    2024-04-02
  • C# 使用CancellationTokenSource取消多线程
    目录几点关键问题解释:同时取消多个线程:有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消 如下...
    99+
    2024-04-02
  • 运用示例简单讲解C#取消令牌CancellationTokenSource
    目录前言简单示例基础操作 定时取消关联取消 判断取消 源码探究构造入手 小插曲WaitHandle 注册操作 取消操作Cancel操作 CancelAfter操作 总结 前言 &nb...
    99+
    2024-04-02
  • C# CancellationToken和CancellationTokenSource的用法详解
    目录CancellationToken通过Register方法注册的服务只会执行一次!CancellationTokenSource使用场景一使用场景二使用场景三Cancellati...
    99+
    2024-04-02
  • C#使用Task实现异步方法
    目录一、async和await特性的结构1. 异步和同步2.async和await二、什么是异步方法1.异步方法的结构2.异步方法三种返回类型理解3.异步方法的控制流三、await表...
    99+
    2023-05-14
    C# Task异步 C# 异步
  • c#中task与thread区别及其使用的方法示例
    目录1.什么是thread2.什么是task3.创建一个task任务有两种模式:1.什么是thread 当我们提及多线程的时候会想到thread和threadpool,这都是异步操作...
    99+
    2024-04-02
  • css取消样式的方法
    这篇文章主要介绍css取消样式的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!css取消样式的方法:1、移除全部样式使用【removeattr(“style”)】;2、移除单个样式使用【css(“属性”,“”)】...
    99+
    2023-06-14
  • C#使用OleDbConnection连接读取Excel的方法
    使用C#连接读取Excel的方法需要使用`OleDbConnection`类。首先需要在项目中引用`System.Data.OleD...
    99+
    2023-08-09
    C#
  • css取消下划线的方法
    这篇文章给大家分享的是有关css取消下划线的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css中,可以使用“text-decoration”属性取消下划线,只需要给元素设置“text-decoration:...
    99+
    2023-06-14
  • html取消滚动条的方法
    这篇文章将为大家详细讲解有关html取消滚动条的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。html取消滚动条的方法:1、通过“overflow-x: hidden”去掉水平滚动条;2、通过“ove...
    99+
    2023-06-14
  • c#中task与thread的区别及使用讲解
    目录一.什么是thread二.什么是task三.创建一个task任务有两种模式1.使用factory创建会直接执行2.我们来看看task的生命周期3.下面演示几个控制task的方法4...
    99+
    2024-04-02
  • mysql取消外键约束的方法
    这篇文章主要介绍了mysql取消外键约束的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql取消外键限制(约束)的方法:通过“ALTE...
    99+
    2024-04-02
  • win10取消内存限制的方法
    这篇文章主要介绍了win10取消内存限制的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。win10取消内存限制方法:首先,在屏幕左下角的Win徽标处右击鼠标,然后点击“运...
    99+
    2023-06-12
  • php取消时间限制的方法
    这篇文章主要介绍“php取消时间限制的方法”,在日常操作中,相信很多人在php取消时间限制的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php取消时间限制的方法”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • win11取消登录账户的方法
    这篇文章主要讲解了“win11取消登录账户的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win11取消登录账户的方法”吧!win11怎么取消登录账户:首先点击任务栏中间的开始,然后点击...
    99+
    2023-07-01
  • Windows8取消讨厌的Modern UI的方法
      说起Windows8的Modern UI,有人欢喜有人愁。喜欢这个UI的人,更多的是Windows8平板电脑的使用者,然而更多的人则是在使用PC上使用Windows8,因此并不喜欢这一UI。那么,要取消Windows...
    99+
    2023-06-06
    Win8 Modern UI Windows8 方法
  • Android ScrollView取消惯性滚动的方法
    ScrollView中惯性滚动的效果,想让这个ScrollView慢一点滑动或者接近drag(拖拽)操作,就提出了添加阻尼的说法。只要重新fling方法即可,将velocity...
    99+
    2022-06-06
    方法 scrollview Android
  • 在git中取消__pycache__文件的方法
    目录如何在 git 中取消 pycache 文件补充:git清除__pycache__文件 _第一步,清除已经存在的缓存文件第二步,设置.gitignore忽略 ...
    99+
    2023-01-29
    git 取消pycache文件 git 清除pycache文件
  • C# interface的使用方法
    本篇内容介绍了“C# interface的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C# interface使用有什么优点呢?首...
    99+
    2023-06-17
  • C++ decltype的使用方法
    这篇文章主要介绍“C++ decltype的使用方法”,在日常操作中,相信很多人在C++ decltype的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ decltype的使用方法”的疑惑有所...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作