Как избавиться от темы в C # - PullRequest
6 голосов
/ 26 октября 2011

Я использовал многопоточность в своем веб-приложении, о котором я упоминал ниже:

var t1 = new Thread(F1);
            t1.IsBackground = true;
            t1.Start();

            var t2 = new Thread(F2);
            t2.IsBackground = true;
            t2.Start();

            var t3 = new Thread(F3);
            t3.IsBackground = true;
            t3.Start();

            var t4 = new Thread(F4);
            t4.IsBackground = true;
            t4.Start();


            t1.Join();
            t2.Join();
            t3.Join();
            t4.Join();

Это работает нормально и дает мне желаемый результат.

Нужно ли после этого убивать / удалять нить, если да, то как? Пожалуйста, руководство.

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

Ответы [ 2 ]

11 голосов
/ 26 октября 2011

Вызов Join() - это то, что освобождает поток. Вам не нужно больше ничего делать. Просто убедитесь, что потоки очищают все ресурсы, которые они могут использовать, прежде чем выйти.

Тем не менее, я призываю вас изучить использование пула потоков или параллельной библиотеки задач (TPL), а не явное управление потоками. Их легче использовать, и они справляются с такими вещами гораздо более плавно.

7 голосов
/ 26 октября 2011

Если бы я был на вашем месте, я бы использовал 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...