У меня есть служба Windows, которая может получать запросы, я хочу обрабатывать в каждом запросе в отдельной ветке.ThreadPool или Task.Factory
Я хочу также ограничить количество потоков, т.е. не более 5 потоков.
И я хочу ждать для всех потоков, прежде чем я закрыть приложение,
Что такое лучший способ сделать это?
Что я пробовал:
for (int i = 0; i < 10; i++)
{
var i1 = i;
Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done"));
}
Task.WaitAll();//Not waiting actually for all threads, why?
Таким образом, я могу ограничить число theads?
Или
var events = new ManualResetEvent[10];
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 10; i++)
{
var i1 = i;
ThreadPool.QueueUserWorkItem(x =>
{
Test(i1.ToString());
events[i1].Set();
});
}
WaitHandle.WaitAll(events);
Существует еще один способ осуществить это?
Как вы получаете запрос? Такие вопросы. Не так ясно, что вы должны использовать пул. И SetMaxThreads() - это приложение-глобальное, вы предотвращаете потоки, чтобы отменить потоки помощников. –
* Как только вы набираете 'new Thread()', это закончено; ваш проект уже имеет устаревший код. * Параллельность в C# Cookbook, @StephenCleary - что также относится к 'ThreadPool' –
http://stackoverflow.com/questions/9315937/net-tpl-limited-concurrency-level-task-scheduler -with-task-priority, https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.maximumconcurrencylevel, ... –