2012-08-08 48 views
1

我們正在使用Visual Studio C#2010和SQL SERVER處理客戶端服務器套接字編程。系統內存異常

該程序工作正常。但一段時間後它絆倒錯誤

"System out of memory exception" 

這裏我們使用一個插座包類

public class SocketPacket 
{ 
     public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber, string ClientIP) 
     { 
      m_currentSocket = socket; 
      m_clientNumber = clientNumber; 
      m_ClientIP = ClientIP; 
     } 
     public System.Net.Sockets.Socket m_currentSocket; 
     public int m_clientNumber; 
     public byte[] dataBuffer = new byte[10000000]; 
     public string m_ClientIP; 
    } 

我覺得DataBuffer中得到充分

如何釋放的DataBuffer?

+0

System.Net.Sockets.Socket是Idisposible,所以你需要手動處置它。 – user854301 2012-08-08 05:22:53

+0

感謝您的工作響應,但在處理客戶端斷開連接之後。如何管理。 – 2012-08-08 06:29:35

回答

2

你的SocketPacket類包含System.Net.Sockets.Socket類型的字段,它實現IDisposible接口,在這個原因中,你應該手工處理你的類的實例。另外我建議你在SocketPacket課上實施IDisposible。

public class SocketPacket: IDisposable 
    { 
     public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber, string ClientIP) 
     { 
      m_currentSocket = socket; 
      m_clientNumber = clientNumber; 
      m_ClientIP = ClientIP; 
     } 
     public System.Net.Sockets.Socket m_currentSocket; 
     public int m_clientNumber; 
     public byte[] dataBuffer = new byte[10000000]; 
     public string m_ClientIP; 
     public void Dispose() 
     { 
      m_currentSocket.Dispose(); 
     } 
    } 
+0

感謝您的工作響應,但在處理客戶端斷開連接之後。如何管理。 – 2012-08-08 06:24:56

+0

可以顯示完整的'SocketPacket'類源。也許你不需要將'socket'傳遞給這個類。 – user854301 2012-08-08 06:38:27

+0

我在做多線程應用程序和維護System.Collections.ArrayList中的列表 – 2012-08-08 06:44:41

0

您應該檢查有關如何正確實現IDisposable的MSDN報告。這可能會解決您的問題。 http://msdn.microsoft.com/en-us/library/ms244737(v=vs.80).aspx

編輯:經過一番進一步的考察,C#類型的Socket也實現了IDisposable,所以嘗試使用圍繞Socket對象的使用()塊。這將確保您正確清理Socket對象。