Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 0MQ windows GUI最佳实践_C#_.net_Winforms_Zeromq - Fatal编程技术网

C# 0MQ windows GUI最佳实践

C# 0MQ windows GUI最佳实践,c#,.net,winforms,zeromq,C#,.net,Winforms,Zeromq,我有一个很简单的问题。我想使用0MQ实现一些非常基本的发布/订阅功能。我的订户应用程序是基于windows GUI的应用程序,使用普通winforms 由于在0MQ中似乎没有明确的参考来处理这个场景,我假设在最坏的情况下,一旦0MQ线程收到任何订阅消息,我就必须在windows GUI线程上使用BeginInvoke(…)。这似乎很简单,但如果有人对处理这件事的最佳方法有任何见解/意见/头脑,我将非常感激 提前谢谢 David对于WinForms应用程序中的ZeroMQ订阅服务器,您至少有几个选

我有一个很简单的问题。我想使用0MQ实现一些非常基本的发布/订阅功能。我的订户应用程序是基于windows GUI的应用程序,使用普通winforms

由于在0MQ中似乎没有明确的参考来处理这个场景,我假设在最坏的情况下,一旦0MQ线程收到任何订阅消息,我就必须在windows GUI线程上使用BeginInvoke(…)。这似乎很简单,但如果有人对处理这件事的最佳方法有任何见解/意见/头脑,我将非常感激

提前谢谢
David

对于WinForms应用程序中的ZeroMQ订阅服务器,您至少有几个选项:

  • 使用后台工作线程接收您的0MQ消息。当您收到消息时,将其传递给后台工作人员
    progressChanged
    事件以更新您的UI
  • 使用系统线程接收消息并调用以更新UI
  • 关于SO的另一个建议还建议在收到消息时使用系统线程对消息进行排队,并使用计时器事件对消息进行出列。如果使用窗体计时器,则可以在不调用的情况下更新UI;如果使用系统计时器,则需要调用

  • 您选择哪种方法取决于您的设计标准。

    如前所述,有几种方法可以将ZeroMq连接到WinForms应用程序中。它与在其他设置(如控制台应用程序)中使用ZeroMq和C#没有太大区别。主要区别在于,您指出,为了更新Gui控件,必须将消息放入Gui线程

    使用单独的线程+队列(生产者/消费者模式)的示例如下:

    另一种方法是(再次)使用一个单独的线程来执行ZeroMq工作,并设置一个事件,该事件在每次收到消息时触发。然后Gui可以连接事件处理程序并处理消息。当然,您还必须调用对Gui的任何更新。这种方法的一个缺点是,事件处理会稍微干扰ZeroMq处理程序线程,特别是当Gui更新需要一段时间,并且如果您收到大量数据时


    所有解决方案都有其优缺点,这完全取决于您的特定问题域的外观。总而言之,将ZeroMq集成到C#应用程序中,无论是WinForms还是其他应用程序,在我看来都非常简单。这本书写得很好,使用方便。您可能遇到的问题更多地与ZeroMq本身的有限错误反馈有关。如果你遇到奇怪的碰撞;尝试在控制台应用程序中运行相同的逻辑,这将为您提供更好的错误消息。

    更多信息将有助于识别您要查找的内容。我不确定您是在引用内置的0mq上下文背景线程,还是您自己的执行0mq内容的线程。通常使用0mq,您创建一个上下文,代码中的每个线程都有自己的套接字(都是从一个上下文构建的,您可以跨线程边界共享它的线程安全的上下文)。然后,您可以阻止套接字的发送/接收,或者设置zmq_poll对象,以便在套接字有可用消息时进行轮询。。。