0

这是我用来从在 NetworkStream 之上创建的 GZipStream 读取数据的 AsyncCallback:

    void ReadCompressedDataCallback(IAsyncResult ar)
    {
        var state = ar.AsyncState as ReadCompressedDataState;
        try
        {
            switch (state.State)
            {
                case EReadCompressedDataState.BeginRead:
                    state.State = EReadCompressedDataState.EndRead;
                    state.InputStream.BeginRead(state.Buf, 0, state.Buf.Length, ReadCompressedDataCallback, state);
                    break;
                case EReadCompressedDataState.EndRead:
                    var read = state.InputStream.EndRead(ar);
                    if (read==0)
                    {
                        state.OnCompleted();
                        return;
                    }
                    state.Result.Write(state.Buf,0,read);
                    state.State = EReadCompressedDataState.BeginRead;
                    ReadCompressedDataCallback(ar);
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
        catch (Exception e)
        {
            state.LastException = e;
            state.OnCompleted();
        }
    }

state.InputStream类似于新的 GZipStream(NetworkStream)。

我的问题是我第一次打电话read = state.InputStream.EndRead(ar);read总是0,阅读停止。当我在调试器中再次开始读取时,会读取一些数据。

根据我读过的文档,NetworkStream 仅在没有更多字节要读取时才在读取时返回 0 字节,但这里返回 0 字节,并且在下一次读取时会跟随一些数据。

如何正确读取所有 gzip 压缩的数据,而不会冒着让应用程序“死锁”以等待永远不会到达的数据的风​​险?

4

1 回答 1

1

您的示例代码看起来有点不寻常。我认为另一个答案可能会帮助您从 NetworkStream 调用 BeginRead

于 2013-09-09T19:40:41.033 回答