【问题标题】:Does Task.Factory.FromAsync(BeginRead, EndRead) read the entire data block before completing?Task.Factory.FromAsync(BeginRead, EndRead) 是否在完成之前读取整个数据块?
【发布时间】:2011-10-02 20:19:53
【问题描述】:

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

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 并且它仅在读取所有字节时完成?这是调用我帖子顶部的代码 sn-p 的代码行:

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

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

【问题讨论】:

    标签: c# android android-asynctask tcpclient


    【解决方案1】:

    Task.Factory.FromAsync 只是围绕预先存在的异步 BeginXXX/EndXXX 对创建了一些脚手架。由于这些方法只是被框架包装和调用,而不是由你显式调用,所以它们操作的方法将保持不变。

    【讨论】:

    • 你能解释一下为什么没有运行条件吗?即使发送大量数据并将缓冲区大小设置为非常小的数字,条件也永远不会运行。有必要吗?
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2019-02-12
    • 2012-08-30
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多