1

这可能是一个非常幼稚的问题:

我正在尝试创建一个使用 ZeroMQ 与多个服务器通信的客户端应用程序。客户端希望向这些服务器发送大量请求并获得对它们的响应(req-rep 模式)。

我面临的问题是 ZeroMQ 套接字只能在创建它们的线程中使用。

一种方法是在新任务中调用每个请求:在任务内部,创建连接、发送请求并获得响应。但是,连接设置非常昂贵。

第二种方法可能是让连接打开到不同线程中的服务器;然后以某种方式在与线程相同的上下文中调用发送例程并获得结果。C# 中有没有办法从线程 Y 调用线程 X 上的函数,但在线程 X 的上下文中执行它然后获取返回值?

我知道这可能是一个不好的方法。在没有太多开销的情况下实现我想要的最佳方法是什么?

4

1 回答 1

0

处理此类场景的典型方法是设置SynchronizationContext。尽管最常见的示例围绕 UI 线程展开,但此类正是针对这种类型的场景而设计的。

您可以使用SynchronizationContext.Post异步将“消息”发布到该上下文(线程),该上下文(线程)将在完成时接收回调。这可以通过 TPL 来简化,它特别允许您TaskScheduler从 a创建 a SynchronizationContext,这反过来又允许您安排 aTask在自定义上下文上运行。

使用 C# 5,这变得非常有用,因为您可以使用async/await来同步您的调用并将工作推送到/从这些“线程”。

有关实现示例,请参阅ActionDispatcherSynchronizationContextNito异步库中的内容。

于 2013-10-10T23:38:25.430 回答