Третий подход (WaitAll) недопустим, потому что Task.WaitAll
является методом возврата void
, поэтому его нельзя ожидать. Этот код просто выдаст ошибку во время компиляции.
Три других подхода очень похожи, с некоторыми незначительными различиями.
Простое ожидание: запускает все задачи и затем ждет их один за другим. Он соберет все результаты в правильном порядке. В случае исключения будет возвращено до того, как все задачи будут завершены, и будет сообщать только об исключении первой неудачной задачи (сначала по порядку, а не в хронологическом порядке).
Не рекомендуется, если это поведение именно то, что вы хотите (скорее всего, это не).
WhenAll : запускает все задачи, а затем ожидает их выполнения. Он соберет все результаты в правильном порядке. В случае исключения будет возвращено после того, как все задачи были выполнены, и будет сообщать только об исключении из первой неудачной задачи (сначала по порядку, а не в хронологическом порядке).
Не рекомендуется, если это поведение именно то, что вы хотите (наиболее вероятно это не так).
WhenAny : запускает все задачи, а затем ожидает их выполнения. Все результаты будут собраны в порядке их завершения, поэтому исходный порядок не будет сохранен. В случае возникновения исключения немедленно вернутся и сообщат об исключении первой неудачной задачи (на этот раз в хронологическом порядке, а не по порядку). В while
l oop вводятся накладные расходы, которые отсутствуют в двух других подходах, которые будут весьма значительными, если число задач превышает 10 000, и будут расти в геометрической прогрессии по мере увеличения числа задач.
Не рекомендуется, если это не то поведение, которое вам нужно (держу пари, что вы не должны быть его поклонниками).
Все эти подходы : бомбардирует удаленный сервер с помощью огромное количество одновременных запросов, затрудняющих быстродействие этой машины и в худшем случае запускающих защитный механизм анти-DOS-атаки.
Лучшее решение этой проблемы - отбросить все эти посредственные подходы, и вместо этого использовать библиотеку, специализированную для такого рода проблем, которая встроена в. NET Core и доступна в виде пакета для. NET Framework. Это библиотека TPL Dataflow , которая позволяет построить конвейер обработки, состоящий из блоков обработки syn c или asyn c, каждый из которых сконфигурирован со своей степенью параллелизма. Вы получите оптимальную производительность, вы получите контроль над тем, какую нагрузку вы поместите на удаленный сервер, вы будете оптимально использовать ресурсы ЦП вашего локального компьютера, вы получите результаты в правильном порядке, и вы ' Я получу исключение вскоре после провала первой задачи. В качестве бонуса вы также получаете возможность отменить операцию в любое время, если у вас есть sh. Недостатком является кривая обучения, которая, к счастью, не очень крутая. Вы сможете успешно использовать эту библиотеку после одного или двух дней обучения.