Стресс-тест с асинхронно вызывающим потоком 100 - PullRequest
0 голосов
/ 06 апреля 2011

Я просто хочу вызвать поток 100 асинхронно с C # (вы можете думать, что каждый поток один пользователь), и я хочу получить среднее время сериализации моего кода. Должен ли я использовать Thread Pool для этого? Thx

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

Я просто хочу вызвать поток 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 голосов
/ 06 апреля 2011

Вы определенно можете использовать ThreadPool для своей задачи, но вы должны знать, как ThreadPool управляет потоками. Если вы попытаетесь запустить 100 потоков следующим образом:

for (int i = 0; i < 100; i++)
{
    ThreaPool.QueueUserWorkItem(state => UnitOfWork());
}

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

Но я думаю, тебе не стоит об этом беспокоиться. Попробуйте сначала использовать ThreadPool, установите максимальный предел шага на 100 (или выше) с помощью ThreadPool.SetMaxThreads (100) и очереди запросов, как я писал выше.

И если после этого вы захотите что-то более сложное, вы можете использовать класс Thread . Создайте 100 экземпляров класса Thread, запустите их все и используйте. Если вы используете класс Thread, вы можете контролировать время жизни каждого потока, то есть ждать завершения потоков без использования дополнительных приемов.

0 голосов
/ 06 апреля 2011

Если вы установите MaxThreads на 100 и более, это, вероятно, лучшее решение.

ThreadPool.SetMaxThreads(100)
...