Если бы я был на вашем месте, я бы использовал ThreadPool вместо ручных потоков.Он обрабатывает все эти вещи сам, и у вас нет накладных расходов на создание и уничтожение потоков.Код, вероятно, будет немного сложнее, потому что вам нужно будет использовать ManualResetEvent вместо простого Thread.Join () (см. Как я могу выполнить ThreadPool.Join? ), но вы не будетенадо беспокоиться о создании слишком большого количества потоков, и это почти в 40 раз быстрее.
Вот класс для теста, который я написал, сравнивая два подхода:
class ThreadPoolVsThreads
{
private static readonly PerformanceMonitor threadPoolTest = new PerformanceMonitor("ThreadPoolTest");
private static readonly PerformanceMonitor threadTest = new PerformanceMonitor("ThreadTest");
private const int iterations = 100;
private const int threads = 10;
private static long somevalue;
public static void Test()
{
TestHelper.PerformTest(10, threadPoolTest, ThreadPoolTest);
TestHelper.PerformTest(10, threadTest, ThreadTest);
}
private static void ThreadPoolTest(int iteration)
{
for (int i = 0; i < iterations; i++)
{
var resetEvents = new ManualResetEvent[threads];
for (int j = 0; j < threads; j++)
{
var re = new ManualResetEvent(false);
resetEvents[j] = re;
ThreadPool.QueueUserWorkItem(o =>
{
somevalue++;
re.Set();
});
}
WaitHandle.WaitAll(resetEvents);
}
}
private static void ThreadTest(int iteration)
{
for (int i = 0; i < iterations; i++)
{
var threadArray = new Thread[threads];
for (int j = 0; j < threads; j++)
{
var thread = new Thread(o => somevalue++);
threadArray[j] = thread;
thread.Start();
}
for (int j = 0; j < threads; j++)
{
threadArray[j].Join();
}
}
}
}
И вот результат для пяти прогонов:
Действие ThreadPoolTest завершено: итерация = 1, завершение-время = 53, averageCompletionTime = 53.000
Действие ThreadTest завершено: итерация = 1, завершение-время = 2128, среднее значениеCompletionTime = 2128.000
Действие ThreadPoolTest выполнено: итерация = 2, завершение-время = 42, averageCompletionTime = 47.500
Действие ThreadTest завершено: итерация = 2, завершение-время = 2149, averageCompletionTime = 2138.500
Действие ThreadPoolTest выполнено: итерация =3, Окончание времени = 65, среднее время завершения = 53,333
ThreadTest aЗавершено: итерация = 3, завершение-время = 2078, averageCompletionTime = 2118.333
Действие ThreadPoolTest завершено: итерация = 4, завершение-время = 72, averageCompletionTime = 58.000
Действие ThreadTest выполнено: итерация = 4, завершение-время= 2137, AverageCompletionTime = 2123.000
Действие ThreadPoolTest выполнено: итерация = 5, завершение-время = 43, AverageCompletionTime = 55.000
Действие ThreadTest выполнено: итерация = 5, завершение-время = 2085, среднее время-завершение-2115.400