将 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 传递给任务类构造函数有什么用? 的相关文章

随机推荐

  • 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