Task.Factory.FromAsync(BeginRead,EndRead)在完成之前是否读取整个数据块?

时间:2011-10-02 20:19:54

标签: c# android android-asynctask tcpclient

我现在的代码中有这样的内容:

state.BytesRead += readPacket.Result;

if (state.BytesRead < state.Data.Length)
{
    Read(state);
}
else
{
    nextRead(state);
}

但是,我注意到第一个if语句永远不会运行。我尝试做这样的事情,看看我是否能够有条件地运行:

tcpClient.SendBufferSize = 16;
tcpClient.ReceiveBufferSize = 16;

但它仍然没有运行。我在客户端和服务器之间发送了大量数据(长度超过1000个字符的字符串)但是条件永远不会运行。看起来它总是只是一次读入所有字节。

这是因为我使用Task.Factory.FromAsync并且它只在读取所有字节后才完成吗?以下是调用我帖子顶部代码片段的代码行:

Task<int>.Factory.FromAsync(state.Stream.BeginRead, state.Stream.EndRead, state.Data, state.BytesRead, state.Data.Length - state.BytesRead, state);

我在FromAsync之前使用异步回调,并且所有教程都需要检查是否在继续下一次读取之前读取了所有字节。 FromAsync不再需要这个吗?它现在会自动处理吗?

1 个答案:

答案 0 :(得分:1)

Task.Factory.FromAsync仅围绕预先存在的异步BeginXXX / EndXXX对创建了一些支架。由于方法仅由框架包装和调用而不是由您显式调用,因此它们运行的​​方法将保持不变。