这是我用来从在 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 压缩的数据,而不会冒着让应用程序“死锁”以等待永远不会到达的数据的风险?