【问题标题】:How to synchronize sending and receiving frames on the client side?如何在客户端同步发送和接收帧?
【发布时间】:2016-09-27 14:46:34
【问题描述】:

如果我发送请求(帧)B并接收响应,同时我已经在等待前一个请求(A)的响应,那么在B任务中收到的响应实际上是对A请求的响应:

request A sent
request B sent
request B processed (quick)
response B sent
response B received (*)
...
request A processed (slow)
response A sent
response A received 

通过简单匹配,我会在点 (*) 处获得匹配请求 A--响应 B。

那么如何同步它们呢? IE。我想用响应 A 结束请求 A,用响应 B 结束请求 B,无论处理每个请求需要多长时间。作为记录,我使用的是经销商路由器插座。

我正在考虑创建池请求 (Dictionary),并将任务完成令牌绑定到发送的每个请求。任务在池中创建新槽,发送请求并等待完成。在后台有一个任务一直在运行——一个接收器——它只是接收响应,将每个响应放在适当的槽中并将给定的任务令牌设置为已完成。我是在正确的轨道上,是我错了,还是已经在 NetMQ 中实现了?

【问题讨论】:

    标签: c# multithreading zeromq netmq


    【解决方案1】:

    在我的博客中了解 AsyncSocket 模式:

    http://somdoron.com/2014/08/netmq-asp-net/

    它有一个带有 TaskCompletionSource 的示例,每个请求的序列和字典。

    【讨论】:

    • 谢谢,我正在考虑这样的解决方案。
    【解决方案2】:

    如果您想要同步请求/响应通信,您可以使用 REQ/REP 套接字而不是 DEALER/ROUTER。

    如果您想要异步通信并且需要将响应与请求相匹配,您可以在请求中发送唯一的请求 ID,并在响应中返回此请求 ID。

    【讨论】:

    • 好吧,我已经在来回发送 ID,但它是 我的 数据,对吗? IE。 ZeroMQ 不处理它们,对吧?所以我仍然需要想出一些算法来匹配这些 ID。
    • 没错,你需要匹配对请求的响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多