2010-05-24 93 views
0

我遇到一个问题,即我的应用程序中的句柄数量不断增长。我做了调试,并认识到这是由System.Threading.Thread类用于某些例程引起的。为了简化我创建了一个示例.NET应用程序调试:使用.NET System.Threading.Thread处理泄漏类

... 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t = new Thread(DoWork); 
     t.Start(); 
    } 

    public void DoWork(object parameter) 
    { 
     // Do something... 
    } 

    ... 

每次我点击按钮,使用System.Threading.Thread类创建一个线程。 问题是,看起来像线程不释放句柄,因为每次点击导致句柄数量增长~5。

问题是:如何手动释放由System.Threading.Thread类创建的所有句柄?

在此先感谢。

+1

这将取决于把手您的应用程序正在泄漏的类型的错误,它们是怎么分配的。 DoWork方法有什么作用? – 2010-05-24 09:01:57

+0

其实即使DoWork不做任何事情(如我的例子) - 有5个手柄在泄漏。我做了:1)创建测试.net应用程序2)在主窗体上放置一个按钮3)添加按钮单击事件处理程序和DoWork就像我的例子。而已。即使这样简单的应用程序导致5处理泄漏 – Mahno 2010-05-24 09:07:44

回答

1

这实际上并没有泄漏手柄,只是GC尚未收集它们。尝试更改按钮处理程序中的代码,使其循环并创建500个线程或尝试按几次,您可能会看到手柄正在收集。

+0

我已经怀疑GC,并试图等待一天(与我的应用程序) - 什么都没有发生。现在我会用测试应用重复测试。到目前为止,我点击了很多次以获得大约1K的手柄。 10分钟后仍然有相同数量的手柄,继续等待... – Mahno 2010-05-24 10:27:03

+0

1000可能还不足以让它开始做东西,尝试5-10,000,你应该看到事情马上就会发生。 – 2010-05-24 10:40:40

+0

嗯...我有什么办法手动强制执行GC清理手柄吗?像“等待另一个10K手柄才能被GC清理”这样的实际答案不会满足我的客户... – Mahno 2010-05-24 10:44:37

1

您不需要手动释放线程句柄,只需删除对Thread实例的所有引用即可。鉴于线程不再运行,并且所有对它的引用都被删除,gargabe收集器将释放下一个集合中的句柄。

就你而言,它看起来并不像线程永远不会完成。

+0

我的线程是在本地鼠标单击哈勒函数中创建的(请参阅示例),这意味着所有引用都会在我们离开函数后立即删除。但实际上情况并非如此 - 手柄仍然存在。 – Mahno 2010-05-24 10:24:39