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

本文关键字:读取 数据 FromAsync Factory BeginRead EndRead Task | 更新日期: 2023-09-27 18:10:20

在我的代码中,现在我有这样的东西:

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?它现在能自动处理了吗?

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

Task.Factory.FromAsync仅仅在已经存在的异步BeginXXX/EndXXX对周围创建了一点脚手架。由于方法只是由框架包装和调用,而不是由您显式调用,因此它们操作的方法将保持不变。