2016-02-26 3 views
1

Давайте предположим, что у нас есть производитель-потребитель шаблон, созданный с одной продуцирующих задачи и 3 Потребительские задачи следующим образом:Отменить только одну задачу с CancellationToken

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

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

вопрос, как я могу только отменить Task Consumer [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

Холли молли, что хорошее злоупотребление Linq, действительно хорошо: D – Gusman

+0

@Gusman: Я не рассматриваю его как злоупотребление LINQ ... альтернативой будет цикл, который просто проецируется в коллекцию, которая звучит как точно такой тип LINQ предназначен для :) –

+1

хорошо, может быть, «злоупотребление» - не лучшее слово, может быть, «расширенное использование»? во всяком случае, действительно умный – Gusman