2016-05-14 57 views
-1

如何停止列表中的任務再次實現。任務列表如何停止任務C#

for (f = 0; f < 3; f++) 
{ 
    list1.ForEach(t => t.Start()); 
    list1.ForEach(t => t.Wait()); 

    Task.WaitAll(list1.ToArray()); 

    //here is problem 
    list1.ForEach(t => t.Cancel()); 
} 
+0

請解釋一點。我無法理解你的問題。 – NineBerry

+0

我需要認識到這個循環中,但一個執行後,我得到錯誤「錯誤‘System.Threading.Tasks.Task’不包含‘IsCancellationRequested’的定義,並沒有擴展方法‘IsCancellationRequested’接受的第一個參數可以找到類型'System.Threading.Tasks.Task'(你是否缺少使用指令或程序集引用?)「 – Quicki

回答

1

該任務無法取消自己。從你顯示的代碼看起來你有一個任務列表。然後,如果您在執行你的代碼希望能夠取消任務,你必須創建一個CancellationTokenSource並傳遞CancellationToken到任務的構造函數:

list1.Add(new Task<string>((x) => { return x.ToString(); }, cancelationTokenSource.Token)); 

(在上面的代碼我假定任務有望返回一個字符串,但它會爲任何任務工作)

然後,如果你需要取消您使用cancelationTokenSource任務:

cancelationTokenSource.Cancel(); 

這將終止任務。然後你可以做的任務本身是檢查它是否已被取消:

list1.ForEach(t => 
{ 
    if (t.IsCanceled) 
    { 

    } 
} 

希望有所幫助。我的回答是基於我對你的代碼的解釋,因爲問題沒有太多解釋。如果您需要更多細節,請澄清。

+0

我可以添加像這樣的任務嗎? 'List list1 = new List ();對於(int i = 0; i <5; i ++) { list1.Add(new Task(actionA)); }' – Quicki

+0

實際上,'cancelationTokenSource.Cancel'不會以'Thread.Abort'的方式取消任務 - 相反它會告訴任務在_和__時停止,並且如果任務詢問其CancellationToken是否應該停止下次。此外,任務已經知道它的'CancellationToken',它傳遞到'Task.Run'只是讓其地位變得'Canceled',而不是'Failed'如果令牌拋出一個'TaskCanceledException' ... – Haukinger

+0

沒有必要註銷在這種情況下,由於對WaitAll()的調用,所有任務都已完成; –

0

夫婦的事情第一:

不要使用任務建構。 使用 Task.Run()請參閱http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx

但在你的情況,我甚至不確定你應該使用任務。對於循環有PLINQ。

這段代碼迴路

list1.ForEach(t => t.Start()); 
list1.ForEach(t => t.Wait()); 

基本上使得它運行啓動任務,然後開始下一個循環之前等待它的內部。

我建議使用Parallel.ForAll()的時候,你需要幾個CPU綁定操作的循環來完成。如果是IO綁定使用異步/等待

然後,您嘗試做的是取消任務,你已經等待它們完成後。這是沒有道理的,或者我不明白你想要完成什麼。

現在,讓我們談談取消工作。你需要像這樣的東西:

var cts = new CancellationTokenSource(); 
var ct = cts.Token; 

提供CancellationToken ct到list1中的任務。然後調用cts.Cancel()來取消給定令牌的任務。 例如Task.Run(asyncWork, ct)其中asyncWork是您要執行的操作。

在操作asyncWork,檢查使用ct.ThrowIfCancellationRequested();

取消見https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/

您需要提供更多關於你把列表1中爲更好的建議的任務。