Параллельный Linq над `IAsyncEnumerable`? - PullRequest
1 голос
/ 21 апреля 2020

Любая официальная или стабильная сторонняя библиотека, которая поддерживает использование AsParallel поверх IAsyncEnumerable<T> (. NET Standard 2.1)?

Я не хочу переносить IAsyncEnumerable<T> в IEnumerable<Task<T>> с асинхронными c методами, TaskCompletionSource или чем-то другим из-за дополнительных затрат.

1 Ответ

2 голосов
/ 21 апреля 2020

Комбинация параллели и асин c не имеет большого смысла. Целью параллелизма является одновременное использование нескольких процессоров / ядер, тогда как асинхронность заключается в том, чтобы вообще не использовать ресурсы ЦП.

AsParallel ( PLINQ ) используется с IEnumerable s в тех случаях, когда перечисление IEnumerable требует значительных ресурсов процессора. Другими словами, когда необходимо выполнить много-много инструкций ЦП между одним вызовом MoveNext и следующим. При IAsyncEnumerable s задержка (обычно) не вызвана вызовом самого метода MoveNextAsync, а ожиданием возвращенного ValueTask. Ожидание ожидаемого объекта потребляет ноль ресурсов ЦП. И вы не можете контролировать, когда это будет завершено. Взять, к примеру, Task.Delay(1000). Он завершится не раньше, чем через секунду, и вы не сможете заставить его завершиться за полсекунды, если не найдете способ как-нибудь согнуть spacetime . ?

...