2016-05-30 81 views
0

我有一個函數可以爲發票計算生成35個任務。在asp.net取消任務

我的代碼:

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(); 
     } 

它不能正常工作

+3

你正在創建一個新的對象,並調用Cancel而不是實際的? –

+0

是啊,我的功能在DAL層,並通過UI取消通話。 這不可能嗎? –

+0

您需要存儲可以在其上調用Cancel的cts。作爲一個領域。然後,您不要在您的點擊處理程序中使用新的CancellationTokenSource,而是使用該字段。 –

回答

1

從MSDN的摘錄:

「A的CancellationToken使線程之間的合作取消, 線程池工作項目或任務對象。對象通過使用CancellationTokenSource創建一個取消標記,然後將取消標記傳遞給任意數量的線程或對象將會收到取消通知。令牌不能用於發起取消。當擁有對象在取消令牌源 上調用取消時,取消令牌的每個 副本上的IsCancellationRequested屬性均設置爲true。該 收到該通知的對象可以以任何方式爲 適當的迴應。」

的一點是,取消通過令牌僅設置了‘IsCancelled’屬性設置爲true,你的代碼‘CalcSingle’需要查詢該屬性經過代碼中的任何邏輯步驟並正常退出,這是因爲.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