如何在c#中配置线程

Zer*_*ity 6 c# asp.net multithreading asp.net-4.0

我在我的Web应用程序中使用了线程,我在下面提到过:

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();
Run Code Online (Sandbox Code Playgroud)

这工作正常,给我所需的输出.

我是否需要在此之后杀死/处置线程,如果是,那么如何?请指导.

我告诉过,如果我不处理它,可能会引发性能问题.

Jim*_*hel 12

调用Join()是取消分配线程的内容.你不必做任何其他事情.只需确保线程在退出之前清理它们可能正在使用的任何资源.

也就是说,我建议您研究使用线程池或任务并行库(TPL)而不是显式管理线程.它们更容易使用,并且更顺畅地处理这种事情.

  • 从技术上讲,`Join`不会释放一个线程.它只是等待线程完成.GC会为您解除分配. (7认同)

Ken*_*ith 7

如果我在你的鞋子里,我会使用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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是五次运行的输出:

ThreadPoolTest操作已完成:iteration = 1,completionTime = 53,averageCompletionTime = 53.000

ThreadTest操作已完成:iteration = 1,completionTime = 2128,averageCompletionTime = 2128.000

ThreadPoolTest操作已完成:iteration = 2,completionTime = 42,averageCompletionTime = 47.500

ThreadTest操作完成:iteration = 2,completionTime = 2149,averageCompletionTime = 2138.500

ThreadPoolTest操作已完成:iteration = 3,completionTime = 65,averageCompletionTime = 53.333

ThreadTest操作完成:iteration = 3,completionTime = 2078,averageCompletionTime = 2118.333

ThreadPoolTest操作已完成:iteration = 4,completionTime = 72,averageCompletionTime = 58.000

ThreadTest操作完成:iteration = 4,completionTime = 2137,averageCompletionTime = 2123.000

ThreadPoolTest操作已完成:iteration = 5,completionTime = 43,averageCompletionTime = 55.000

ThreadTest操作已完成:iteration = 5,completionTime = 2085,averageCompletionTime = 2115.400