我有一个函数可以生成35个发票计算任务。
我的代码:
public int CalcGroup()
{
try
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
for (int i = 0; i < 35 ; i++)
{
var myTask = new Task<long>(() => CalcSingle(_personnelIds.Item1), ct, TaskCreationOptions.LongRunning);
myTask.Start();
}
}
catch (Exception)
{
return 0;
}
return 1;
}
“CalcSingle()是另一个正在处理它的任务。” 我取消任务的事件是:
protected void btnStopCalc_Click(object sender, EventArgs e)
{
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel();
}
无法正常使用
答案 0 :(得分:1)
摘自MSDN:
&#34; CancellationToken支持线程之间的协作取消, 线程池工作项或Task对象。一个对象创建一个 使用CancellationTokenSource取消令牌,然后通过 取消令牌应该是任意数量的线程或对象 收到取消通知。令牌不能用于启动 消除。拥有对象调用取消时 CancellationTokenSource,每个上的IsCancellationRequested属性 取消令牌的副本设置为true。那个对象 收到通知可以以任何方式回应 。适当&#34;
重点是通过令牌取消仅设置&#34; IsCancelled&#34; property to true,你的代码在&#34; CalcSingle&#34;需要在代码中的任何逻辑步骤之后轮询该属性并正常退出。这样做是因为.Net不知道你的代码是否正在做一些关键的事情,并且任意取消任务可能会使你的执行处于不良状态。
看看:https://msdn.microsoft.com/en-us/library/dd997289(v=vs.110).aspx
这是关于如何为任务(TPL)执行此操作的一个很好的示例:https://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx