将 CancellationToken 传递给任务类构造函数有什么用?

2024-01-23

以下是创建模拟长时间运行流程的新任务的示例代码。该任务本身并没有太多内容,只是专注于取消功能。我正在使用取消令牌来取消任务,并且代码对我来说工作正常。

CancellationTokenSource CTS = new CancellationTokenSource();

Task<Boolean> PTask = new Task<Boolean>(() => 
{
   while (true)
   {
       if (!CTS.Token.IsCancellationRequested)
       {
          Thread.Sleep(5000);
       }
       else { Console.WriteLine("Thread Cancelled");break; }
   }
   return true;

}, CTS.Token, TaskCreationOptions.None);

PTask.Start();
Console.WriteLine("Hit Enter to cancel the Secondary thread you have started");
Console.ReadLine();
CTS.Cancel();
System.Console.WriteLine(PTask.Result);

但我无法理解的一件事是令牌参数(CTS.Token)正在传递给Task构造函数。即使不将令牌传递给构造函数,我实际上也可以取消任务,那么传递参数的实际用途是什么。

下面是一个稍作修改的版本,无需令牌参数即可工作。

CancellationTokenSource CTS = new CancellationTokenSource();
Task<Boolean> PTask = new Task<Boolean>(() => 
{
   while (true)
   {
       if (!CTS.Token.IsCancellationRequested)
       {
           Thread.Sleep(5000);
       }
       else
       {
           Console.WriteLine("Thread Cancelled");
           break;
       }
};

更新: 下列msdn http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45问题描述了原因:

将令牌传递到 StartNew 会将令牌与任务关联起来。 这有两个主要好处:

  1. 如果令牌有取消 在任务开始执行之前请求,任务不会 执行。它不会立即转换为“运行”,而是会 过渡到已取消。这避免了运行任务的成本,如果 无论如何,它都会在运行时被取消。

  2. 如果身体的 任务还监视取消令牌并抛出 包含该标记的OperationCanceledException(这就是ThrowIfCancellationRequested确实如此),那么当任务看到 OCE 时, 它检查 OCE 的令牌是否与任务的令牌匹配。如果它 确实如此,该例外被视为对合作的认可 取消并且任务转换到 Canceled 状态(而不是 比故障状态)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 CancellationToken 传递给任务类构造函数有什么用? 的相关文章

  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • std::forward 与 std::move 的用法[重复]

    这个问题在这里已经有答案了 我总是读到std forward仅适用于模板参数 然而 我问自己为什么 请参见以下示例 void ImageView setImage const Image image image image void Ima
  • 在 React Native 中使用 Firebase 进行 Google 登录

    请注意 由于需要解释 问题可能会很长 否则它可能会非常模糊并导致相同的旧答案 我在创建时遇到问题Google Sign In页面进入React Native using firebase 基于firebase文档 随着 3 1 0 SDK
  • 如何防止 Windows(手机)8.1 通用应用程序锁屏?

    有谁知道如何防止 Windows 手机 8 1 通用应用程序中的锁屏 在 Windows Phone 8 中 我使用过 PhoneApplicationService Current UserIdleDetectionMode IdleDe
  • 将 C++ int 数组编组为 C#

    我想将一个整数数组从 C 编组到 C 我有一个非托管 C dll 其中包含 DLL EXPORT int fnwrapper intarr int test new int 3 test 0 1 test 1 2 test 2 3 retu
  • 使用 GitLab 将 Node.js 应用程序持续部署到 Heroku

    有涵盖 Ruby 和 Python 应用程序部署的教程 但我找不到 NodeJS 的良好文档或示例 http docs gitlab com ce ci examples test and deploy python application
  • 如何在 C++ 中清除 2D 矢量

    任何人都可以建议我 如何在 C 中清除 2D 矢量 我必须编写需要读取 Matrix Process 和 Clear Matrix 的程序 并为下一次读取操作做好准备 我已经使用向量创建了二维数组 gt 我正在填充但无法重置 下面是参考代码
  • WPF - 为基类实现 System.ComponentModel.INotifyPropertyChanged

    我想为基类上的属性实现 System ComponentModel INotifyPropertyChanged 接口 但我不太确定如何连接它 以下是我想要接收通知的属性的签名 public abstract bool HasChanged
  • 可编辑的 WPF 列表视图

    我想做一个ListView当用户双击某个项目时可编辑 我意识到网络上有很多示例 但是这些示例都是基于IsSelected属性 而不是处理双击事件 有什么想法或指示吗 UPDATE 因此 我遇到的另一个问题是 如何访问数据模板中的控件List
  • 使用假 mongoDB 进行 pytest 测试

    我有连接到 MongoDB 客户端的代码 我正在尝试测试它 为了进行测试 我不想连接到实际的客户端 因此我试图找出一个假客户端来进行测试 代码的基本流程是我在某处有一个函数创建一个pymongo客户端 然后查询并创建一个在其他地方使用的字典
  • 发布 Android 应用程序后,谷歌地图不显示?

    朋友们 在使用模拟器在 Eclipse 上测试应用程序时 谷歌地图可以正确显示 但是当我导出应用程序来发布它时 谷歌地图不见了 谁能指导我我犯了什么错误 任何帮助 将不胜感激 当您导出应用程序以发布它时 您可能不再使用调试密钥库 而是使用自
  • UIBezierPath 未绘制平滑曲线

    我正在使用 UIBezierPath 进行绘图 并且我已经编写了关于触摸事件的代码并且其工作正常 但是我的曲线不平滑 当我移动手指并绘制一些曲线时 它们不平滑 void drawRect CGRect rect UIColor redCol
  • npm WARN 已弃用 [email protected]:core-js@<3 不再维护,由于问题数量较多,不建议使用

    我在创建新的 Angular 应用程序时遇到以下错误 npm 警告已弃用 电子邮件受保护 cdn cgi l email protection core js 我尝试了下面链接中给出的解决方案 但它对我不起作用 错误 请将您的依赖项升级到
  • 查找未注册任何课程的学生姓名 - 学生、教师、课程、课程、已注册

    根据下面的数据库 使用关系代数投影出未注册课程的学生的姓名 Students snum sname major standing age gpa Faculty fid fname deptid Courses cnum cname cou
  • Java中如何对字符串进行加密

    我需要的是加密将显示在二维条形码 PDF 417 中的字符串 这样当有人想扫描它时 它就不会可读 其他需求 不应该很复杂 它不应该由 RSA PKI 基础设施 密钥对等组成 它必须足够简单 以消除人们的窥探 并且对于有兴趣获取该数据的其他公
  • 修改python-docx中paragraph.style._element.xml中的XML

    我想修改边框的颜色 我通过调用获取它的 XMLstyle element xml gt gt gt document Document gt gt gt run document add heading u 0 add run hello
  • Android 6 异常(谷歌地图?)

    我在 firebase 崩溃报告中遇到异常 但不明白异常原因 应用程序在 Android 5 上运行良好 Exception java lang IllegalAccessError Method java lang Object ade
  • 在 Python 中迭代 XML 标签并获取元素的 xpath

    我想迭代 XML 文档中的每个 p 标签 并能够获取当前元素的 xpath 但我没有找到任何可以做到这一点的东西 我尝试过的代码类型 from bs4 import BeautifulSoup xml file open data xml
  • 彗星服务器选择问题

    我想写一个使用comet技术进行实时更新的php网站 我有几个问题 使用彗星服务器更好吗 彗星服务器哪家好 对于comet服务器 例如orbited 我必须首先安装基于python的orbited服务器 然后编写php文件来创建套接字以连接
  • 使用 fftw 和窗函数生成正确的频谱图

    对于一个项目 我需要能够从 WAV 文件生成频谱图 我读过以下应该做的事情 获取N 变换大小 个样本 Apply a window http en wikipedia org wiki Window function功能 使用样本进行快速傅
  • 将 CancellationToken 传递给任务类构造函数有什么用?

    以下是创建模拟长时间运行流程的新任务的示例代码 该任务本身并没有太多内容 只是专注于取消功能 我正在使用取消令牌来取消任务 并且代码对我来说工作正常 CancellationTokenSource CTS new CancellationT