C#threading:在其上下文中的不同线程上调用函数并返回结果

时间:2013-10-10 23:19:10

标签: c# multithreading zeromq

这可能是一个非常天真的问题:

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

处理此类情景的典型方法是设置SynchronizationContext。此类仅适用于该类型的场景,但最常见的示例围绕UI线程。

您可以使用SynchronizationContext.Post将“消息”异步发布到该上下文(线程),该消息将在完成时收到回调。这可以通过TPL简化,特别允许您从TaskScheduler创建SynchronizationContext,这样您就可以安排Task在自定义上下文中运行。< / p>

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

有关实施示例,请参阅ActionDispatcherSynchronizationContext中的Nito Asynchronous Library