【发布时间】: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