2013-08-01 2 views
1

Привет, я привязался к Task.Factory.StartNew. Так же, как я думаю, я понял, что кто-то предложил мне написать следующий код;Task.Factory.StartNew - путать о пуле

bool exitLoop = false;     
while (!exitLoop) 
{ 
    exitLoop = true; 
    var messages = Queue.GetMessages(20); 
    foreach (var message in messages)      
    { 
     exitLoop = false; 
     Task.Factory.StartNew(() => 
        { 
         DeliverMessage(message); 
        }); 
    } 
} 

В теории это будет стекать очередь, 20 сообщений в то время, пытаясь создающей Задачу для каждого сообщения в очереди. Так что, если бы у нас было 1000 сообщений в очереди, то в одно мгновение у нас было бы 25 заданий, и он просочился бы через все сообщения. Раньше я думал, что понял это, я думал, что StartNew будет блокироваться, как только закончится запись - в старые времена это было бы ~ 25. Но учитывая это .net 4.5, у меня сейчас создается впечатление, что верхний предел для пул теперь довольно высокий. Меня озадачивает то, что я предположил, что это наполнит пул новыми задачами и начнет блокировку, т. Е. В одно мгновение у меня теперь работает 1000 задач. Итак, если лимит пула сейчас вряд ли является пределом, почему я не вижу 1000 задач?

[Изменить] ОК, так что я вижу, что 1000 задач поставлены в очередь для запуска, а не для запуска. Итак, как определить количество выполняемых/выполняемых задач?

+0

Task.Factory выполнит каждую задачу в своей очереди либо сразу, либо когда планировщик найдет доступные потоки. Кроме того, вам необходимо передать токен отмены при использовании метода StartNew, чтобы избежать неожиданного завершения задач, вызванных GC. Я не уверен, как определить количество запущенных/выполняемых задач tho. –

+0

Также я забыл упомянуть, что пул задач не будет блокировать что-либо, вот почему есть планировщик задач. –

+0

Вы хотите знать, какое количество выполняемых в настоящее время задач или какие-либо задачи остались незавершенными? – Linky

ответ

0

Я знаю, что это довольно скоро после вашего сообщения, но я надеюсь, что это может помочь кому-то столкнуться с вашей конкретной задачей. Ваш последний комментарий заявил, что метод «DeliverMessage» выполнял HTTP-запросы.

Если вы используете объект «WebClient» (например), чтобы выполнить ваши запросы, он будет связан свойством ServicePointManager.DefaultConnectionLimit. Это означает, что он будет создавать не более двух (по умолчанию) одновременных подключений к хосту. Если вы создали 1000 параллельных задач, все 1000 из них должны будут обслуживаться этими двумя соединениями.

Вам нужно будет поиграть с различными значениями для этой настройки, чтобы найти правильный баланс между пропускной способностью в приложении и нагрузкой на веб-сервере.

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