2009-04-19 123 views
0

我在SerialPort類中遇到了一個非常大的問題,我需要一些幫助來解決這個問題。.NET 2.0/3.5中的SerialPort內存泄漏

我們在通用列表中使用多個串行端口,因爲我們需要連接到多個設備。

這是我們的基本代碼看起來像......

List<SerialPort> ports = new List<SerialPort>(); 
private void button1_Click(object sender, EventArgs e) 
{ 
    ports.Add(new SerialPort("COM6")); 
    ports.Add(new SerialPort("COM7")); 
    ports.Add(new SerialPort("COM8")); 
    foreach (SerialPort port in ports) 
    { 
     port.Open(); 
    } 
} 

現在,單擊該按鈕後,如果其中一個設備(移動電話在我們的例子中)被關閉或者其電纜與USB端口斷開連接,會立即出現大量內存泄漏。

請幫助我們解決方案。

我注意到在Microsoft Connect中有一個類似的線程here和幾個錯誤報告。 但現在我需要一個即時緊急解決方案......如果有人幫忙,我會很感激。 非常感謝。

+0

順便說一下,該鏈接去專家交換(而不是微軟連接),似乎並沒有工作。有趣的是,如果單詞之間沒有衝突,它可以被看作是「專家性變化」,這與「專家交流」有所不同,但仍然是一個完全有效的網站。太好笑了。 – 2009-04-19 15:50:04

+0

如果您需要立即和緊急的解決方案,那麼就像StackOverflow一樣好,您需要致電Microsoft支持並打開一張票。 – 2009-04-19 15:09:55

回答

2

您確定問題出在SerialPort而不是USB串口設備的驅動程序?我會嘗試其他的測試來驗證問題:

  1. 啓動hyperterm
  2. 連接到您問題的設備
  3. 查看內存使用
  4. 斷開以同樣的方式,在C#中引起問題
  5. 檢查內存用法和比較

如果沒有發生,那麼有一個錯誤,特別是SerialPort 。如果再次發生,您至少會知道它與SerialPort的實施無關。問題可能出在窗口的COM端口代碼或您正在使用的驅動程序中。就我個人而言,我發現它可能是驅動程序中的問題,但我很想知道Window的串行端口是否存在未知問題。

我在使用SerialPort之前連接/斷開端口沒有任何這樣的問題。

你可以嘗試的另一件事是調試到CLR的代碼。在這個topic上還有很多其他的SO問題,所以應該很容易找到這樣做的方法。這應該讓你進一步調試一下,看看究竟在Open()的哪一點發生了內存泄漏。但是警告,因爲它是系統串口的一個「簡單」包裝,你可能會很快看到它進入P/Invoke世界,並且可能看不到太多。

+0

哦,並且對設計發表評論,你的on_click不應該做代碼,它應該調用一個打開的方法(將這個功能歸因於它不屬於UI代碼)。 – 2009-04-19 15:45:52

1

不確定問題是這麼簡單,但是你正確地處理SerialPort對象嗎?您需要在完成每個實例後立即致電Dispose方法。

+0

'Dispose()'僅用於允許顯式立即釋放資源。每個使用非託管資源的類都會實現一個終結器,以防對象在未被明確處理的情況下超出範圍。如果你想要一個安全網。 – 2009-04-19 15:20:26

+0

是的,GC當然會繞過來處理類使用的非託管資源,但這可能不會發生一段時間,特別是如果對象在全局範圍內。這很容易導致內存泄漏。 – Noldorin 2009-04-19 17:11:22