сокет может быть разделен между потоками; Я знаю, что обычные сокеты zqm определенно не безопасны для потоков, но все равно спасибо.

читалРуководство ZeroMq и наткнулся на следующее:

Вы НЕ ДОЛЖНЫ делить сокеты ØMQ между потоками. Разъемы ØMQ не безопасны. Технически это возможно, но для этого требуются семафоры, блокировки или мьютексы. Это сделает ваше приложение медленным и хрупким. Единственное место, где удаленно делиться сокетами между потоками, - это языковые привязки, которые должны творить чудеса, такие как сборка мусора в сокетах.

и позже:

Помните:Не используйте и не закрывайте сокеты, кроме как в потоке, который их создал.

Я также понял, что ZeroMQContext потокобезопасен.

Если класс регистрируется для события другого класса, в .Net это событие может быть вызвано из потока, отличного от потока, в котором был создан прослушиватель.

Я думаю, что есть только два варианта, чтобы иметь возможность отправлять что-то через ZeroMQ-Sockets из обработчика событий:

Синхронизировать обработчик события-потока с потоком ZeroMQ-Socket был создан вСоздать новый ZeroMQ-Socket / получить существующий ZeroMQ-Socket для потока в обработчике событий, используя потокобезопасный ZeroMQ-Context

Похоже, что 0MQ-Guide отговаривает от первого, и я не думаю, что создание нового ZeroMq-Socket для каждого потока - это производительность / путь.

Мой вопрос:
Каков правильный шаблон (каким он должен быть) для публикации сообщений через 0MQ из обработчика событий?

Кроме того, имели ли в виду авторы руководства ZeroMQ-Binding для .Net, когда писали:

Единственное место, где удаленно делиться сокетами между потоками, - это языковые привязки, которые должны творить чудеса, такие как сборка мусора в сокетах. ?

Вот пример кода, чтобы подчеркнуть мою проблему / вопрос:

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 by a different thread. So I have to get a new socket etc?
        using (var socket = ctx.Socket(ZMQ.SocketType.PUSH))
        {
            // init socket etc..... and finally: 
            socket.Send(e.BytesToSend);
        }
        // isn't that too much overhead?
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос