2012-07-31 18 views
2

我有幾種不同的方法可以連接到遠程主機,發送消息,獲得答覆以及使用信息。這一直工作得很好,直到我在我的連接類的同一個實例中使用兩個方法。在我得到錯誤的例子中,我運行以下方法;當使用新創建的網絡流時,網絡流「無法訪問處置對象」

public string sendRequestAccountID(string siteID) 
{ 
    //build message 
    String response = String.Empty; 

    TcpClient client = new TcpClient(); 
    client.Connect(detailsHere); 
    NetworkStream stream = client.GetStream(); 

    StreamWriter writer = new StreamWriter(stream); 
    writer.AutoFlush = false; 

    writer.WriteLine(sb.ToString()); 
    writer.Flush(); 

    StreamReader reader = new StreamReader(stream); 
    List<XmlNode> nodeList = new List<XmlNode>(); 

    byte[] responseBytes = new byte[4096]; 
    int bytesRead = 0; 

    while (true) 
    { 
     bytesRead = stream.Read(responseBytes, 0, responseBytes.Length); 
     if (bytesRead > 0) 
     { 
      //handle message 
     } 
     if (bytesRead == 0) 
     { 
      stream.Flush(); 
      stream.Close(); 
      client.Close(); 
      string finalResponse = stuffHereToSend; 
      return finalResponse; 
     } 
    } 
} 

這發送正常,並按預期返回消息。但是,如果我然後使用我的連接類的相同實例並使用以下方法;

public bool sendNewDevice(IDeviceInterface device) 
{ 
    NetworkStream stream; 
    sb = new StringBuilder(); 
    //build message 
    String response = String.Empty; 

    TcpClient client = new TcpClient(); 
    client.Connect(detailsHere); 
    stream = client.GetStream(); 

    StreamWriter writer = new StreamWriter(stream); 
    writer.AutoFlush = false; 

    writer.WriteLine(sb.ToString()); 
    writer.Flush(); 

    StreamReader reader = new StreamReader(stream); 
    List<XmlNode> nodeList = new List<XmlNode>(); 

    byte[] responseBytes = new byte[4096]; 
    int bytesRead = 0; 

    while (true) 
    { 
     bytesRead = stream.Read(responseBytes, 0, responseBytes.Length); 
     if (bytesRead > 0) 
     { 
      //handle message 
     } 
    } 
} 

我收到一個錯誤,它顯示「無法訪問已處理的對象」;

bytesRead = stream.Read(responseBytes, 0, responseBytes.Length); 

雖然我認爲我剛剛剛剛分配在最新的方法流。它試圖使用以前關閉的?有沒有辦法解決這個問題或者我失蹤的東西?

編輯:是不是與客戶處置不正確?這兩種方法在一秒鐘內運行,也許第二種方法在第一種方法關閉之前打開?

+0

有一個已經從方法去除任何代碼?也許是放置'作家'或'讀者'的東西?當處理StreamWriter或StreamReader時,它會處理底層的流。 – 2012-07-31 12:18:36

+0

不怕,我只在每種方法的末尾處理/關閉。我已經改變(true)到(stream.CanRead),這似乎讓它超越了這一點。我現在沒有收到服務器的迴應,所以這肯定是另一個問題。 – 2012-07-31 12:37:47

回答

6

StreamWriter(和閱讀器)關閉或其Dispose方法被調用時,它將處理基礎流。在.net 4.5之前,除了使用StreamWriter以外的其他東西,或者編寫一個類來包裝StreamStreamWriter,並忽略對Dispose的調用之外,沒有任何事情可以做。在.NET 4.5中,有一個過載可以用來告訴StreamWriter不要處理你給它的流。如:新StreamWriter(stream, StreamWriter.UTF8NoBOM, 1024, false)

你可以嘗試使用一個包裹流忽略接近(主叫new StreamWriter(new NonDisposableStreamWrapper(stream))):

public class NonDisposableStreamWrapper : Stream 
{ 
    private Stream wrappedStream; 

    public NonDisposableStreamWrapper(Stream wrappedStream) 
    { 
     this.wrappedStream = wrappedStream; 
    } 

    public override void Flush() 
    { 
     wrappedStream.Flush(); 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     return wrappedStream.Seek(offset, origin); 
    } 

    public override void SetLength(long value) 
    { 
     wrappedStream.SetLength(value); 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     return wrappedStream.Read(buffer, offset, count); 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     wrappedStream.Write(buffer, offset, count); 
    } 

    public override bool CanRead 
    { 
     get { return wrappedStream.CanRead; } 
    } 

    public override bool CanSeek 
    { 
     get { return wrappedStream.CanSeek; } 
    } 

    public override bool CanWrite 
    { 
     get { return wrappedStream.CanWrite; } 
    } 

    public override long Length 
    { 
     get { return wrappedStream.Length; } 
    } 

    public override long Position 
    { 
     get { return wrappedStream.Position; } 
     set { wrappedStream.Position = value; } 
    } 
}