2016-02-26 55 views
1

讓我們假設我們有一個的生產任務和3個消費任務如下創建一個生產者 - 消費者模式:取消只有一個任務具有的CancellationToken

 Task[] Consumer = new Task[10]; 
     for (int i = 0; i < 3; i++) 
     { 

      Consumer[i] = Task.Run(() => DoWork(CancellationToken ct)); 
     } 

的問題是我怎麼只能取消任務消費品[2 ]?當發送取消確認消息時,所有消費者都會停止!如果需要,我希望能夠取消單個消費者。

非常感謝

+1

您需要製作單獨的取消令牌。 – Enigmativity

回答

4

如果需要單獨取消所有的消費者,則需要單獨取消標記 - 從而單獨取消標記源。

var consumers = 
    Enumerable 
     .Range(0, 10) 
     .Select(_ => new CancellationTokenSource()) 
     .Select(cts => new { Task = Task.Run(() => DoWork(cts.Token)), 
          TokenSource = cts }) 
     .ToList(); 

將會給你一個List<T>每個元素的任務及其相應的CancellationTokenSource。所以如果你想取消consumers[0].Task,你可以撥打consumers[0].TokenSource.Cancel()

+1

Holly molly,Linq的一個很好的濫用,真的很好:D – Gusman

+0

@Gusman:我不認爲它是濫用LINQ的......另一種方法是將一個循環放入一個集合中,這聽起來像正是LINQ設計的那種:) –

+1

好吧,也許「濫用」不是最好的詞,也許是「擴展使用」?無論如何,真的很聰明 – Gusman

相關問題