Если у меня есть массив из 100 строк, и я хочу создать 10 потоков, каждый из которых будет принимать в себя строку из массива.
Как только строка обработалась, в поток поступает следующая строка из массива. Как это можно сделать?
Parallel.ForEach, можно указать максимальное кол-во потоков
Ченелами Делаешь 10 ченелов воркеров и 1 ченел который раздаёт из массива когда ченелы освободились
И в освободишийся поток автоматом прилетит следующая задача?
Нет. Параллел форЫч чанкает
В случае наличия внутри await всё будет весело.
+ Помню, писал реализацию асинка для енумерабл под это дело.. Ну нахер))
Пример был со строками в массиве, самое простое для этого кейса Parallel.ForEach Другое дело, если есть асинхронщина. Можно использовать Semaphore. Можно использовать те же Channel-ы, как предложил выше Айрат
Ага. Ну, там вариант либо как гуру сказал через ченнелы, либо через Semaphoreslim
Да, абсолютно точно.
Слушай, не совсем могу понять, как именно использовать ченелы тут
https://gist.github.com/Szer/a8f4ac7921ac4ed4f0a0a777602bb67a
Ооооо, спасибо большое, Айрат, оч приятно, что заморочился и написал!)
заметь что ченелы нигде в апи операции не торчат, это сугубо деталь имплементации
Я вроде весь код понял, но как его переделать под шарп вообще не понял
Да в смысле! Один в один же! Я там только в конце использовал фшарпный asyncSeq чтобы воспользоваться IAsyncEnumerable
Обсуждают сегодня