我阅读了ZeroMq指南,我偶然发现了以下内容:
你不能在线程之间共享ØMQ套接字.ØMQ套接字不是线程安全的.从技术上讲,它可以做到这一点,但它需要信号量,锁或互斥量.这将使您的应用程序变得缓慢而脆弱.在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.
后来:
切记:除了创建它们的线程外,不要使用或关闭套接字.
我也明白ZeroMQ Context是线程安全的.
如果一个类在.Net中注册另一个类的事件,则可以从与创建监听器的线程不同的线程调用此事件.
我认为只有两个选项可以从事件处理程序中通过ZeroMQ-Sockets调度:
Socket创建ZeroMQ-的线程Socket/获取现有Socket的ZeroMQ-Context  似乎0MQ-Guide不鼓励第一个,我不认为为每个线程创建一个新的ZeroMq-Socket是高性能/可行的方式.
我的问题:
在事件处理程序中通过0MQ发布消息的正确模式(它的意图是什么)是什么?
此外,该指南的作者在编写时还考虑到.Net的ZeroMQ-Binding:
在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.?
这里有一些示例代码来强调我的问题/问题:
public class ExampleClass
{
    public event EventHandler<ByteEventArgs> SomethinIsCalledFromAnotherThread;
}
public class ByteEventArgs : EventArgs
{
    public byte[] BytesToSend;
}
public class Dispatcher
{
    ZMQ.Context ctx;
    public Dispatcher(ZMQ.Context mqcontext, ExampleClass exampleClassInstance)
    {
        this.ctx = mqcontext;
        exampleClassInstance.SomethinIsCalledFromAnotherThread += new EventHandler<ByteEventArgs>(exampleClass_SomethinIsCalledFromAnotherThread);
    }
    void exampleClass_SomethinIsCalledFromAnotherThread(object sender, ByteEventArgs e)
    {
        // this method might be called …