取消asp.net中的任务

时间:2016-05-30 05:48:53

标签: c# asp.net

我有一个函数可以生成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();
         }

无法正常使用

1 个答案:

答案 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