【问题标题】:C# threading: calling a function on a different thread in its context and returning resultsC# 线程:在其上下文中的不同线程上调用函数并返回结果
【发布时间】:2013-10-10 23:19:09
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# multithreading zeromq


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!我将研究使用 SynchronizationContext。
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多