Привет, я привязался к 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 задач поставлены в очередь для запуска, а не для запуска. Итак, как определить количество выполняемых/выполняемых задач?
Task.Factory выполнит каждую задачу в своей очереди либо сразу, либо когда планировщик найдет доступные потоки. Кроме того, вам необходимо передать токен отмены при использовании метода StartNew, чтобы избежать неожиданного завершения задач, вызванных GC. Я не уверен, как определить количество запущенных/выполняемых задач tho. –
Также я забыл упомянуть, что пул задач не будет блокировать что-либо, вот почему есть планировщик задач. –
Вы хотите знать, какое количество выполняемых в настоящее время задач или какие-либо задачи остались незавершенными? – Linky