【问题标题】:how to add a Cancellation Token to a Task?如何将取消令牌添加到任务?
【发布时间】:2016-10-13 23:18:23
【问题描述】:

我被介绍给 Task,并走到这一步:

在主要:

 Task<double> t = Task.Run(TW.DoingMegaFlops_Async);

在 TW 班的位置:

 public async Task<double> DoingMegaFlops_Async()
 {...await ...; return 0.0;}

我的概念控制台应用程序构建并运行良好。 问题是如何用Cancellation Token 扩展它。我试过这个:

CancellationTokenSource wtokenSource= new CancellationTokenSource();
Task.Run(TW.DoingMegaFlops_Async(wtokenSource.Token), wtokenSource.Token);

在 TW 类中:

public async void DoingMegaFlops_Async(CancellationToken wtoken)
{...await...; return;}

Main 中的构建错误是:

Cannot convert from 'void' to 'System.Action'

我已经玩弄了投射到(动作),但无济于事。 其实我不是很明白我在这里做什么,所以想向论坛学习。

正如您从代码 sn-ps 中看到的,我已经通过转到 void 的返回类型来减少 Async 方法的接口。不知道这是否真的让事情变得更容易了。

【问题讨论】:

  • 确实,我宁愿返回一些有用的数据。这就是我需要取消令牌的原因,这样当应用停止时,我可以以干净的方式停止任务,并显示一些任务结果数据。

标签: c# task cancellation-token


【解决方案1】:

Task.Run(TW.DoingMegaFlops_Async)Task.Run(() =&gt; TW.DoingMegaFlops_Async()) 的“方法组”简写 - 这是允许的,因为您正在调用不带参数的方法。

但是,当调用带参数的方法时,您必须包含它:

Task.Run(() => TW.DoingMegaFlops_Async(wtokenSource.Token), wtokenSource.Token);

【讨论】:

  • 太好了,这确实可以构建。这甚至允许添加返回值。听说我使用了速记符号,我感到很惊讶。避免使用 lambda 表示法并更正“我的”表示法不是更容易吗? “() =>”符号在我看来,我从 Fortran 开始,有点像高等数学。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2017-08-12
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多