#c# #.net #multithreading #asynchronous #threadpool
#c# #.net #многопоточность #асинхронный #threadpool
Вопрос:
Я просто хочу вызвать 100 потоков асинхронно с C # (вы можете думать, что в каждом потоке один пользователь), и я хочу получить среднее значение времени сериализации моего кода.Должен ли я использовать пул потоков для этого? Спасибо
Ответ №1:
Я просто хочу вызвать 100 потоков асинхронно
Что вы конкретно имеете в виду?
Если вам нужно выполнить 100 задач асинхронно -ThreadPool — лучшее решение. Вас не волнуют потоки, просто помещайте рабочие элементы в очередь в пул, а операционная система распределяет элементы между доступными потоками. Вы должны понимать, что все ваши 100 задач могут быть обработаны только 3 или 5 (например) потоками.
Если вам нужно создать 100 потоков и делегировать каждую задачу отдельному потоку — ThreadPool не является решением, потому что ThreadPool не создает новые потоки. Вы должны создать их вручную.
// Create 100 threads
var threads = new List<Thread>();
for (int p = 0; p < 100; p )
{
threads.Add(new Thread(() => MyTask()));
}
// Start them all
foreach (var thread in threads)
{
thread.Start();
}
// Wait for completion
foreach (var thread in threads)
{
thread.Join();
}
Ответ №2:
Вы определенно можете использовать ThreadPool для своей задачи, но вы должны знать, как ThreadPool
управляет потоками. Если вы попытаетесь запустить 100 потоков таким образом:
for (int i = 0; i < 100; i )
{
ThreaPool.QueueUserWorkItem(state => UnitOfWork());
}
тогда нет никакой гарантии, что все 100 потоков будут выполняться в отдельных потоках одновременно. ThreadPool ставит задачи в очередь и выполняет их, используя свободные потоки в ThreadPool, следовательно, он может ставить в очередь все ваши задачи одну за другой и выполнять их одну за другой. Я не говорю, что это произойдет, но гипотетически это может быть.
Но я думаю, вам не стоит беспокоиться об этом. Сначала попробуйте использовать ThreadPool, установите максимальное ограничение на 100 шагов (или выше) с помощью ThreadPool.Установите maxThreads(100) и поставьте запросы в очередь, как я писал выше.
И если после этого вам захочется чего-то более сложного, вы можете использовать класс Thread. Создайте 100 экземпляров Thread
класса, запустите их все и используйте. Если вы будете использовать Thread
класс, вы можете контролировать время жизни каждого потока, т. Е. ожидать завершения потоков без использования каких-либо дополнительных приемов.
Комментарии:
1. Хорошо, спасибо, но у меня есть еще один вопрос. Я установил ThreadPool. SetMaxThreads(100,100) но это не работает на 100 потоков. Существует ли какое-либо количество потоков по умолчанию? Я использую консольное приложение
2. Что вы имеете в виду, говоря «не работает»? Не могли бы вы немного объяснить? Кстати, вы можете принудительно
ThreadPool
запускать задачи в очереди, а не ставить их в очередь, устанавливая минимальное ограничение потоков, используя msdn.microsoft.com/en-us/library /… . Как сказано в MSDN, вы должны осторожно использоватьThreadPool
пользовательские ограничения, особенно в производственной среде.
Ответ №3:
Если вы установите maxThreads равным 100 и более, это, вероятно, лучшее решение.
ThreadPool.SetMaxThreads(100)