я начинаю несколько параллельных задач, например:Есть ли общий Task.WaitAll?
var tasks =
Enumerable.Range(1, 500)
.Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue))
.ToArray();
, а затем присоединиться к ним с
Task.WaitAll(tasks);
На этой последнюю строку я получаю синий волнистый маркер под tasks
, с предупреждающим сообщением:
Co-variant array conversion from Task[] to Task[] can cause run-time exception on write operation.
Я понимаю, почему я получаю это сообщение, но есть ли способ обойти это? (например, как общая версия Task.WaitAll()
?)
В этом случае преобразование безопасно, потому что 'WaitAll()' не будет записывать в массив. Есть ли причина, по которой вы хотите ее избежать? – svick
Кроме того, .Net 4.5 будет содержать ['Task.WhenAll()'] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall%28v=vs.110% 29.aspx), который возвращает одну «Задачу», которая завершается, когда все «Задачи» в коллекции завершены. И он также имеет общую версию, и он работает с любым 'IEnumerable' 'Task'. –
svick
@svick thx для наконечника. похоже, что они переименовали то, о чем вы говорите, WhenAll, чтобы вы могли просто сказать «ждут задачи».WhenAll (task1, task2); –