处理.Net线程泄漏

时间:2015-11-23 23:26:24

标签: c# .net multithreading

这实际上咬了我几次。如果您执行这样的简单代码:

    private void button1_Click(object sender, EventArgs e)
    {

        for (int i = 0; i < 1000000; i++)
        {
            Thread CE = new Thread(SendCEcho);
            CE.Priority = ThreadPriority.Normal;
            CE.IsBackground = true;
            CE.Start();
            Thread.Sleep(500);
            GC.Collect();
        }
    }

    private void SendCEcho()
    {
        int Counter = 0;

        for (int i = 0; i < 5; i++)
        {
            Counter++;
            Thread.Sleep(25);
        }
    }

运行此代码并观察手柄飞行! Thread.Sleep是这样你可以关闭它,它不会接管你的电脑。这应该保证在下一个线程启动之前启动的线程死掉。调用GC.Collect();什么也没做。根据我的观察,这段代码在正常刷新时每次刷新都会丢失10个句柄。

无效SendCEcho()函数中的内容并不重要,如果需要,则计为5。当线程死亡时,有一个手柄无法清理。

对于大多数程序而言,这并不重要,因为它们不会长时间运行。在我创建的一些程序中,它们需要运行数月和数月。

如果一遍又一遍地运用此代码,最终可能会将句柄泄漏到Windows操作系统变得不稳定的位置,并且它将无法运行。需要重新启动。

我确实通过使用线程池和代码解决了这个问题:

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadJobMoveStudy));

我的问题是,为什么.Net中存在这样的泄漏,为什么它存在这么长时间?既然喜欢1.0?我在这里找不到答案。

0 个答案:

没有答案