Я создаю конвейер, используя поток данных TPL. Скажем, у меня есть конвейер, состоящий из четырех блоков TransformBlock.
GetDataFromDatabase
ProcessData1
ProcessData2
SendDataToRestService
Каждый из них может (вероятно, будет) длительной операцией. GetDataFromDatabase, вероятно, в основном будет ждать ответа базы данных, SendDataToRestService будет ждать ответа службы. ProcessData 1 и 2 будут долго выполняющимися локальными процессами с интенсивным использованием ЦП.
Теперь я намеревался установить максимальную степень параллелизма на каждом из моих блоков в соответствии с количеством ядер на машине (которое, вероятно, будет равно 4).
Но мне приходит в голову, что это означает, что он будет делать сразу 4 GetDataFromDatabases, и 4 сразу ProcessData1, и 4 сразу ProcessData2, и 4 SendDataToRestService сразу. Это означало бы, что у меня потенциально может быть 16 потоков, работающих одновременно. Добавьте к этому, что на самом деле у меня есть 3 разных потока, делающих одно и то же одновременно.
ВОПРОС: Как лучше всего подойти к этому, чтобы получить наилучшую производительность? Из того, что я прочитал, если я попытаюсь сделать слишком много, я могу снизить производительность из-за переключения контекста. Есть ли лучший подход, или это «высоси и посмотри»?
ActionBlock
. Нет необходимости в трубопроводе. - person usr   schedule 09.02.2014ActionBlock
. Просто разместите в нем все рабочие элементы и используйте асинхронный рабочий делегат. Вы можете установить степень параллелизма таким образом. - person usr   schedule 09.02.2014