2013-03-11 4 views
1

Я знаю, что это было задано и обсуждено ранее, но все же я думаю, что неясно, что использовать в этом сценарии.Parallel.ForEach, Task.Factory и N threads

Мне нужно сделать 100 звонков против веб-сервиса, который я знаю, может обрабатывать 16 запросов, в то время (не то, что он потерпит неудачу, если он получает больше)

Я думаю, что Parallel.ForEach для более низкоуровневые интенсивные вызовы ЦП - он решит, сколько потоков лучше всего подходит. Task.Factory использует пул потоков, поэтому может быть меньше 16 потоков (также больше)

Вне курса Я мог бы написать свой собственный пул потоков, но разве нет более очевидного выбора для этого сценария?

+0

Вы уже ошиблись, думая в терминах Threads. В идеале, вы должны использовать один из асинхронных API для выполнения запросов. .. В этом случае вы можете легко обслуживать ответы со значительно меньшим количеством потоков из .net ThreadPool. Я бы подумал о том, чтобы сделать короткий перерыв в задаче и взять минутку, чтобы изучить парадигму асинхронного ожидания, представленную с помощью C# 5/.net4.5 – spender

ответ

1

Я бы использовал Parallel.ForEach, но указываю ParallelOptions с MaxDegreeOfParallelism, установленным на 16. Таким образом, вы даете очень четкое указание на степень параллелизма, которую вы хотите.

Если вы используете Task.Factory Я думаю, что это разумно предположить, что Вы будет получить более 16 параллельных задач, хотя, если вы используете асинхронный IO вам не нужно иметь 16 одновременных темы в любом случае.

Вы можете посмотреть на TPL Dataflow - я не смотрел специально, как легко можно разделить потребителей, но, как это направлена ​​непосредственно на сценарии производитель/потребитель, я был бы удивлен, если вы не мог создать 16 потребителей, а затем просто произвести 100 звонков.

Или, конечно же, вы можете создать 16 потоков, которые будут потреблять то же самое BlockingCollection, содержащее данные для 100 вызовов. Это гарантировало бы уровень параллельности ...

Обратите внимание, что для того, чтобы на самом деле совершить 16 вызовов одновременно с одним и тем же хостом HTTP, вам может потребоваться настроить часть app.config <connectionManagement>.

Смежные вопросы