【问题标题】:Why when I enclose my StreamWriter/StreamReader/NetworkStream in an using statement my server crashes c#为什么当我将我的 StreamWriter/StreamReader/NetworkStream 包含在 using 语句中时,我的服务器会崩溃 c#
【发布时间】:2018-08-05 17:14:46
【问题描述】:

我的网络服务器中有以下语句:

 using(NetworkStream networkStream = client.tcp.GetStream());
     {
            if (networkStream.DataAvailable)
            {
                 using(StreamReader streamReader = new StreamReader(networkStream, true))
                 {                      
                    //do something   
                 }
            }
     }

问题是,当我在这种情况下(或使用 StreamWriter)使用 using() 块时,会出现以下异常:

已建立的连接被您主机中的软件中止 机器

没有“使用”,它工作得很好,但我认为在 IDisposable 类上调用“使用”是一个好习惯。

编辑:单步抛出调试器看到它​​在这部分崩溃:

 using (StreamWriter streamWriter = new StreamWriter(c.tcp.GetStream()))
 {
        await streamWriter.WriteLineAsync(data);
        await streamWriter.FlushAsync();
 }

但是变量中的所有数据都是正确的,没有null StreamWriter并且数据有值。

【问题讨论】:

  • 我认为我们需要更多信息。在调试器中单步执行代码。我能想到的是,StreamReader dispose 也将带走底层流。
  • @BenHall 当然,我可以提供什么样的信息来扩展问题?我不知道采用底层流,因为如果我没记错的话,那会给出一个“ObjectDisposedException”而不是我得到的那个。
  • 确实如此。你有没有通过。它到底在哪里爆炸?
  • @BenHall 我用调试时发现的东西进行了编辑

标签: c# networking


【解决方案1】:

我认为它关闭连接太早了,您需要在写入后读取服务器的响应。

在你写完之后试试这个粗略的测试:

do
{
   await streamReader.ReadLineAsync();
} while (networkStream.DataAvailable);

您需要在 StreamWriter 的上方为 StreamReader 添加另一个 using

比如:

using (NetworkStream networkStream = client.GetStream())
using (StreamWriter streamWriter = new StreamWriter(networkStream))
using (StreamReader streamReader = new StreamReader(networkStream))
{
    await streamWriter.WriteLineAsync(data);
    await streamWriter.FlushAsync();

     do
     {
         await streamReader.ReadLineAsync();
     } while (networkStream.DataAvailable);

     networkStream.Close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多