使用新创建的网络流时,网络流“无法访问已处置的对象”

2024-02-28

我有几种不同的方法来连接到远程主机、发送消息、获取回复和使用信息。这一直工作得很好,直到我在连接类的同一个实例中使用两种方法。在我收到错误的示例中,我运行以下方法;

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);

尽管我认为我刚刚在最新的方法中分配了流。它是否试图使用之前关闭的那个?有没有办法解决这个问题或者我错过了一些愚蠢的事情?

编辑:是否与客户未正确处理有关?这两个方法在一秒钟内运行,也许第二个方法试图在第一个方法关闭之前打开?


When a StreamWriter(和读者)已关闭或其Dispose方法被调用时,它会处理底层流。在 .net 4.5 之前,除了使用除StreamWriter或者写一个类来包装Stream给予StreamWriter并忽略对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; }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用新创建的网络流时,网络流“无法访问已处置的对象” 的相关文章

随机推荐