TPL Dataflow,Post() 和 SendAsync() 之间的功能区别是什么?

2024-01-03

我对通过 Post() 或 SendAsync() 发送项目之间的区别感到困惑。我的理解是,在所有情况下,一旦一个项目到达数据块的输入缓冲区,控制权就会返回到调用上下文,对吗?那么为什么我需要 SendAsync 呢?如果我的假设不正确,那么我想知道,相反,如果使用数据块的整个想法是建立并发和异步环境,为什么有人会使用 Post() 。

我当然理解技术上的区别,Post() 返回一个 bool,而 SendAsync 返回一个 bool 的可等待任务。但这有什么影响呢? bool 的返回(我理解是确认该项目是否被放置在数据块的队列中)何时会被延迟?我理解 async/await 并发框架的一般思想,但在这里它没有多大意义,因为除了 bool 之外,对传入项目所做的任何操作的结果都不会返回给调用者,而是放置在一个“出队列”并转发到链接的数据块或丢弃。

这两种方法在发送物品时有性能差异吗?


要查看差异,您需要一种块将推迟其消息的情况。在这种情况下,Post将返回false立即,而SendAsync将返回一个Task当块决定如何处理消息时,该过程将完成。这Task将有一个true如果消息被接受,则结果,并且false如果没有的话结果。

延迟情况的一个例子是非贪婪连接。一个更简单的例子是当你设置BoundedCapacity:

[TestMethod]
public void Post_WhenNotFull_ReturnsTrue()
{
    var block = new BufferBlock<int>(new DataflowBlockOptions {BoundedCapacity = 1});

    var result = block.Post(13);

    Assert.IsTrue(result);
}

[TestMethod]
public void Post_WhenFull_ReturnsFalse()
{
    var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
    block.Post(13);

    var result = block.Post(13);

    Assert.IsFalse(result);
}

[TestMethod]
public void SendAsync_WhenNotFull_ReturnsCompleteTask()
{
    // This is an implementation detail; technically, SendAsync could return a task that would complete "quickly" instead of already being completed.
    var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });

    var result = block.SendAsync(13);

    Assert.IsTrue(result.IsCompleted);
}

[TestMethod]
public void SendAsync_WhenFull_ReturnsIncompleteTask()
{
    var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
    block.Post(13);

    var result = block.SendAsync(13);

    Assert.IsFalse(result.IsCompleted);
}

[TestMethod]
public async Task SendAsync_BecomesNotFull_CompletesTaskWithTrueResult()
{
    var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
    block.Post(13);
    var task = block.SendAsync(13);

    block.Receive();

    var result = await task;
    Assert.IsTrue(result);
}

[TestMethod]
public async Task SendAsync_BecomesDecliningPermanently_CompletesTaskWithFalseResult()
{
    var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
    block.Post(13);
    var task = block.SendAsync(13);

    block.Complete();

    var result = await task;
    Assert.IsFalse(result);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TPL Dataflow,Post() 和 SendAsync() 之间的功能区别是什么? 的相关文章

随机推荐

  • Google Sheet OAuth 范围只能访问几个文件?

    我们有一个受限制的应用程序 我们可以在其中控制用户帐户的创建 我们还使用 Google 登录 目前 该应用程序尚未经过验证 但它很好 因为所有用户都在我们的 GSuite 域中 但我们希望将其扩展到 GSuite 域之外的用户 用户可以在我
  • Nginx 多个 Node JS Express 应用程序的多个位置

    我有以下配置 location proxy set header X Real IP remote addr proxy set header X Forwarded For proxy add x forwarded for proxy
  • 如何配置 asp.net kestrel 实现低延迟?

    我正在尝试实现一个 asp net 2 2 应用程序 以尽可能低的速度服务 HTTP 请求latency 不是吞吐量 它不是为了生产而是为了某种竞争 该应用程序应该在具有 4 个核心的 Linux docker 容器环境中运行 并且我的处理
  • 使用 PHP 解压较大的文件

    我正在尝试使用 PHP 解压 14MB 存档 代码如下 zip zip open c kosmas zip while zip entry zip read zip fp fopen c unzip import xml w if zip
  • 将当前用户添加到 NLog 输出

    我想向 NLog 输出的每一行添加一个字符串 逻辑保持不变 尝试获取当前用户 如果成功 则将当前用户添加到输出中 我每次都知道如何实现它 但我想将这个模板设置在一个地方 而不是每次编写时都重复它 The WindowsIdentityLay
  • Spring Boot 应用程序与 ECS 中运行的 AWS Distro for OpenTelemetry (ADOT) 之间的通信失败

    我正在尝试在 ECS 中运行 Spring Boot 应用程序 并使用 ADOT 作为边车 在 ECS 任务定义中 我正在为 Spring Boot 应用程序创建任务 我正在启用 Use Metrics Collection 并选择 Ama
  • ActivityManager进程已死亡问题

    我的应用程序包含 5 个屏幕 在第一个屏幕中 我从服务器加载一些数据 并在第二个屏幕的列表视图中显示这些数据 在列表视图中 我必须为每一行显示一个图像 这些图像是动态下载的并且也被缓存 下载发生在后台 我已经为列表视图提供了notifyDa
  • 如何确定字符串中包含的数据类型?

    我有一个接受字符串参数的方法 字符串可以包含整数 长整型 双精度型 布尔型或只是普通的旧字符和数字 我需要一种简单的方法来确定字符串的类型 一种方法可能是使用一堆 try catch 块并尝试将其解析为每种类型 如果抛出异常 则它可能不是该
  • 单击删除父 div

    我正在尝试通过单击链接来删除 div 问题是相同的 div 和链接有多个结构 我尝试制作一个函数 但它删除了所有 div document on click fd bxx cls function e e preventdefault th
  • 如何修复这个 MySQL 触发器?

    我正在尝试让这个触发器发挥作用 CREATE TRIGGER Transaction insert BEFORE INSERT ON Transaction FOR EACH ROW WHERE Number NEW AccountNumb
  • Go 中生产者/消费者最简洁的习惯用法是什么?

    我想做的是拥有一组生产者 goroutine 其中一些可能完成也可能不完成 和一个消费者例程 问题在于括号中的警告 我们不知道将返回答案的总数 所以我想做的是 package main import fmt math rand func p
  • 如何将 docker 与 drupal 和 drush 一起使用?

    我想用drush https github com drush ops drush 它需要在drupal容器中运行 还有一个drush docker 仓库 https hub docker com r drush drush 但我不知道如何
  • 防止电脑休眠

    我有一个正在播放某种媒体的应用程序 我不希望计算机在我的应用程序运行时进入睡眠状态 我查了一下 发现这个可以通过P Invoke来完成 显示器也不应该关闭 计算机也不应该进入睡眠状态 因此 我做了以下操作来测试这一点 b Click x y
  • Git 从现有远程分支添加工作树

    在我的远程存储库中有 3 个分支 主分支和 2 个长期运行的分支 master the common features are here like Core DAL north customized for A company long r
  • 将 PreviewKeyDown 中收到的密钥转换为字符串

    我在窗口上使用 PreviewKeyDown 事件来接收来自条形码扫描仪的所有键 KeyEventArgs 是一个枚举 没有给我实际的字符串 我不想使用 TextInput 因为某些键可能由控件本身处理 并且可能不会冒泡到 TextInpu
  • Spring Boot 应用程序中没有可用的合格 bean 类型

    运行我的 SpringBoot 应用程序时 出现以下错误 运行时出现异常 null IncationTargetException 创建名称为 bookController 的 bean 时出错 通过字段 bookRepository 表达
  • 提升::精神::气。如何将内联解析器表达式转换为独立语法,以及如何解压它们生成的元组?

    我正在使用 QI 和 Phoenix 我想编写一个返回 4 个布尔值的小语法 这些布尔值将用作语义操作内函数调用的参数 我有几个需要这些东西的函数 到目前为止我已经使用了这种方法 qi bool gt gt qi bool gt gt qi
  • 在 x86 上处理非常大的列表

    我需要处理大量浮点数 但在 x86 系统上遇到了内存限制 我不知道最终的长度 所以我需要使用可扩展类型 在 x64 系统上 我可以使用
  • 如何删除除每小时一条记录之外的所有记录

    我有一个包含数百万条传感器记录的 mysql 表 其结构如下 datanumber auto increment stationid int sensortype int measuredate datetime data medtext
  • TPL Dataflow,Post() 和 SendAsync() 之间的功能区别是什么?

    我对通过 Post 或 SendAsync 发送项目之间的区别感到困惑 我的理解是 在所有情况下 一旦一个项目到达数据块的输入缓冲区 控制权就会返回到调用上下文 对吗 那么为什么我需要 SendAsync 呢 如果我的假设不正确 那么我想知