2011-10-02 49 views
0

在我的代码,现在我有这样的事情:在完成之前,Task.Factory.FromAsync(BeginRead,EndRead)是否读取完整的数据块?

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

Task.Factory.FromAsync仅仅在预先存在的异步BeginXXX/EndXXX对上创建了一些脚手架。由于这些方法只是由框架封装和调用,而不是由您明确调用,所以它们的操作方法将保持不变。

+0

你能解释为什么条件不被运行吗?即使发送大量数据并将缓冲区大小设置为非常小的数字,条件也不会运行。它甚至有必要吗? –

相关问题