【问题标题】:How to correctly read zipped data from NetworkStream with BeginRead/EndRead?如何使用 BeginRead/EndRead 从 NetworkStream 正确读取压缩数据?
【发布时间】:2013-09-09 18:05:06
【问题描述】:

这是我用来从基于 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 类似于 new GZipStream(NetworkStream)。

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

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

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

【问题讨论】:

    标签: c# .net networkstream gzipstream


    【解决方案1】:

    您的示例代码看起来有点不寻常。 我认为另一个答案可能会对您有所帮助Calling BeginRead from a NetworkStream

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多