2010-05-24 96 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