【问题标题】:TPL Dataflow with TCP NetworkStream带有 TCP NetworkStream 的 TPL 数据流
【发布时间】:2020-01-07 15:12:52
【问题描述】:

TPL Dataflow 可以用于处理 TCP 字节流吗?我对这个主题相当陌生,正在寻找处理 TCP 字节流的最佳方法。

更具体地说:我在 TCP/IP 之上使用协议 (HSMS),它指定具有 4 个长度字节和消息结构的消息。我正在编写一个库,并且有一个接收解码消息的消费者。 我需要在我的图书馆做的是:

  • 从 Socket 读取字节并缓冲它们
  • 一旦我有了长度字节和消息本身,我就需要对其进行转换/解码。
  • 然后我会将消息传递给库的使用者

通常我有一个生产者和一个消费者。并且 IO 操作是异步的。

我开始手动完成所有操作,但意识到这非常复杂和乏味,尤其是线程安全。所以我偶然发现了 TPL 数据流,我很好奇这个案例是否值得考虑。我主要担心的是我只有一个生产者(Socket)和一个消费者,我想知道这是否矫枉过正。

我还找到了System.IO.Pipelines,但对于我的用例也没有太多信息。

【问题讨论】:

  • 您真的有任何并行的改进吗?我只会单独使用网络流。下面的链接我刚刚使用了 TCP,并且有一个方法 ReadWrite 来防止同时读取和写入。请参阅:stackoverflow.com/questions/44471975/…
  • 你不能让多个线程同时写入同一个套接字,否则你最终会得到重叠的消息,除非你绝对确定这些消息将适合单个缓冲区问题是这不能保证。我无法对带有任务的管道进行足够的评价 - 如果您需要示例,请告诉我。w

标签: c# sockets tcp task-parallel-library tpl-dataflow


【解决方案1】:

我知道这是一篇旧帖子。

是的,TPL 数据流非常适合这个任务,但是对于这样一个简单的处理场景,你可能会在 RX 中使用 system.io.pipeline。一旦你努力深入研究 io.pipeline 和 RX 就很直接了。

然后,Dataflow 将在此之后连接到您的 IObservable<T>,作为流式管道,您可以使用它来详细说明复杂的数据处理。

问候

【讨论】:

  • 与 TPL Dataflow 相比,RX 的学习曲线更陡峭。因此,对于两个都没有经验的人来说,告诉他们两个都学没有多大意义。
  • 大声笑,正如我所见,这里仍然有很多拖钓...出于个人观点而投反对票没有多大意义,
  • 我的投票代表我个人的观点。也就是说,您的回答将 OP 指向了错误的方向。他们已经担心使用 TPL Dataflow 会增加应用程序的复杂性,您的建议基本上是:添加 TPL Dataflow 和 RX 和 Pipelines 等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多