当NetworkStream.Read(byte [],int,int)需要返回-1时,它会中止()运行它的线程吗?

Kan*_*Yoo 2 c# networking stream

        NetworkStream stream = socket.GetStream();

        if (stream.CanRead)
        {
            while (true)
            {
                int i = stream.Read(buf, 0, 1024);
                result += Encoding.ASCII.GetString(buf, 0, i);
            }
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码旨在检索从TcpClient单独的线程上运行的一段时间的消息.Read方法工作正常,直到它应该返回-1表示没有任何东西可以阅读; 相反,它只是在没有任何明显原因的情况下终止它正在运行的线程 - 使用调试器跟踪每个步骤表明它只是在该行之后停止运行.

我也尝试用一个try ... catch没有太大成功的封装它.

可能是什么导致了这个?

编辑:我试过了

        NetworkStream stream = socket.GetStream();

    if (stream.CanRead)
    {
        while (true)
        {
            int i = stream.Read(buf, 0, 1024);
            if (i == 0)
            {
                break;
            }
            result += Encoding.ASCII.GetString(buf, 0, i);
        }
    }
Run Code Online (Sandbox Code Playgroud)

感谢@JonSkeet,但问题仍然存在.线程终止于该read行.

编辑2:我修改了这样的代码,它的工作原理.

    while (stream.DataAvailable)
    {
        int i = stream.Read(buf, 0, 1024);
        result += Encoding.ASCII.GetString(buf, 0, i);
    }
Run Code Online (Sandbox Code Playgroud)

我认为这个问题很简单,我只是没有彻底思考.谢谢大家看看这个!

Jon*_*eet 5

不,Stream.Read当没有什么可读的时候返回0,而不是-1:

返回值
读入缓冲区的总字节数.如果当前没有多个字节可用,则这可能小于请求的字节数,如果已到达流的末尾,则可以小于零(0).

我的猜测实际上,没有异常被抛出并且线程没有被中止 - 但它只是永远循环.如果您在调试器中单步执行,您应该能够看到这一点.无论发生什么,你的"快乐"终止条件永远不会受到影响......