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

本文关键字:线程 调用 函数 返回 结果 上下文 | 更新日期: 2023-09-27 18:34:46

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

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

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

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

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

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

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

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

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

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

有关实现示例,请参阅 Nito 异步库中的ActionDispatcherSynchronizationContext