0MQ windows GUI最佳实践

时间:2012-01-19 21:50:03

标签: c# .net winforms zeromq

我有一个非常简单的问题/问题。我想使用0MQ来实现一些非常基本的Pub / sub功能。我的订阅者应用程序是使用普通winforms的基于Windows GUI的应用程序。

由于在0MQ中似乎没有明确的引用来处理这种情况,我假设在最糟糕的情况下,一旦0MQ线程收到任何订阅,我将不得不在Windows GUI线程上使用BeginInvoke(...)信息。这看起来非常简单,但如果有人对最佳处理方式有任何见解/意见/提醒,我会非常感激。

提前致谢 大卫

2 个答案:

答案 0 :(得分:1)

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

  1. 使用后台工作线程来接收您的0MQ消息。当您收到消息时,会将其传递给后台工作人员progressChanged事件以更新您的UI。
  2. 使用系统线程接收消息并调用以更新UI。
  3. 关于SO的另一个建议还建议使用系统线程在接收时对消息进行排队,并使用计时器事件使消息出列。如果您使用了表单计时器,则可以在不调用的情况下更新UI,或者如果需要系统计时器,则需要进行调用。
  4. 您选择哪种方法取决于您的设计标准。

答案 1 :(得分:1)

正如所指出的,有几种方法可以将ZeroMq连接到WinForms应用程序中。它与在其他设置中使用ZeroMq和C#没有什么不同,例如在控制台应用程序中。主要区别在于您指出必须将消息放入Gui线程才能更新Gui控件。

可以在此处找到使用单独的线程+队列(生产者/消费者模式)的示例:Examples of zeromq pub/sub with C# winform

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

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