У вас была правильная идея с одновременной коллекцией , но вы неправильно использовали метод TPL .
Короче говоря, вы должны быть очень осторожны с asyn c лямбдами , и если вы передаете их Action
или Func<Task>
Ваша проблема Это связано с тем, что Parallel.For / ForEach
не подходит для asyn c и шаблона ожидания или IO-связанных задач . Они подходят для связанных с процессором рабочих нагрузок . Это означает, что они по существу имеют параметры Action
и давайте планировщик задач создадут задачи для вас
Если вы хотите запускать несколько задач одновременно, используйте Task.WhenAll
, или TPL Dataflow ActionBlock
, который может эффективно справляться как с CPU-привязанными , так и IO-ограниченными рабочими нагрузками, или, говоря более непосредственно, они могут справляться с tasks , что такое метод asyn c.
Фундаментальная проблема заключается в том, что когда вы вызываете asyn c lambda на Action
, вы по существу создаете метод async void
, который будет запускаться как задача незамеченным. То есть ваш метод TPL просто создает группу задач параллельно для запуска группы ненаблюдаемых задач и не ожидает их.
Подумайте об этом так, вы попросите группу друзей go и принесете вам продукты, они, в свою очередь, скажут кому-нибудь еще принести вам продукты, но ваши друзья отчитаются перед вами и скажут, что ваша работа выполнена. Это явно не так, и у вас нет продуктов.