Пара вещи первой:
Не использовать конструктор задач. Использовать 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(), когда вам нужно выполнить несколько операций с ЦПУ в цикле. Если это привязка IO, используйте async/await
Затем вы пытаетесь отменить задания после того, как их дождались. Это не имеет смысла, или я недостаточно понимаю, чего вы хотите достичь.
Теперь давайте поговорим об отмене работы. Вам нужно что-то вроде этого:
var cts = new CancellationTokenSource();
var ct = cts.Token;
Предоставьте CancellationToken ct задачам в списке1. Затем вызовите cts.Cancel(), чтобы отменить все задачи, которым задан токен. Например, Task.Run(asyncWork, ct)
, где asyncWork - это действие, которое вы хотите выполнить.
В asyncWork действий, проверьте отмены с использованием ct.ThrowIfCancellationRequested();
См https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/
Вы должны предоставить больше о задачах, поставленных в list1 для лучшего совета.
Пожалуйста, объясните немного больше. Я не могу понять ваш вопрос. – NineBerry
Мне нужно реализовать этот цикл, но после одного выполнения я получаю сообщение об ошибке «Ошибка « System.Threading.Tasks.Task »не содержит определения для« IsCancellationRequested »и никакого метода расширения« IsCancellationRequested », принимающего первый аргумент тип «System.Threading.Tasks.Task» может быть найден (вам не хватает директивы using или ссылки на сборку?) « – Quicki