Ich versuche, eine C # Winform-Anwendung zu erstellen, die ZeroMQ (clrzmq .net-Bindungen (x86) via nuget) in einem Pub / Sub-Modell verwendet.
Nach vielen Suchen kann ich nur Standalone-C # -Beispiele finden, in denen der Code eine while-Anweisung verwendet, um neue Nachrichten unbegrenzt zu verarbeiten. Wenn ich versuche, diese Beispiele zu verwenden, weiß ich nicht, wohin ich den Code setzen soll, und er blockiert nur die GUI und alles andere.
Ich weiß nicht, ob es unmöglich ist, ohne einen anderen Thread zu arbeiten, aber ich hatte den Eindruck, dass das asynchrone Verhalten von ZeroMQ ohne zusätzliche Threads funktionieren könnte. Vielleicht weiß ich nicht, wo ich den zeromq-Code einfügen soll, oder vielleicht brauche ich wirklich einen anderen Thread.
Wenn jemand ein einfaches Pub / Sub-Beispiel mit einer Wegbeschreibung zur Verfügung stellen könnte, wo der Code tatsächlich in eine standardmäßige C # -Winform-Anwendung eingefügt werden soll, wäre dies sehr zu begrüßen.
Ich gehe davon aus, dass Sie den clrzmq ZeroMq-Wrapper in Ihrem Projekt verwenden. Soweit ich weiß, ist es nicht möglich, blockierende Nachrichten in einer einfachen Schleife mit clrzmq zu empfangen, es wird entweder unbegrenzt für eine bestimmte Zeit blockiert (durch Angabe eines Timeouts für die Empfangsmethode) oder bis Sie eine Nachricht erhalten .
Es ist jedoch ziemlich trivial, einen Thread einzurichten, um den Socket regelmäßig abzufragen und eingehende Nachrichten auf ein Queue
zu schieben. Sie können dann zum Beispiel eine einfache WinForms Timer
verwenden, um alle anstehenden Nachrichten von dieser (gemeinsam genutzten) Queue
periodisch zu entfernen. Hier ist ein Arbeitsbeispiel für einen Thread-Abonnenten:
Von Form
wird die Warteschlange regelmäßig abgefragt (in diesem Beispiel wird Forms Timer
verwendet und die Nachrichtendaten einfach an Textbox
angehängt):