0MQ: ¿Cómo usar ZeroMQ de manera segur

Yo leo elZeroMq guide y me topé con lo siguiente:

NO DEBE compartir tomas ØMQ entre hilos. Los enchufes ØMQ no son seguros para roscas. Técnicamente es posible hacer esto, pero requiere semáforos, bloqueos o mutexes. Esto hará que su aplicación sea lenta y frágil. El único lugar donde es remotamente sensato compartir sockets entre hilos es en enlaces de idiomas que necesitan hacer magia como la recolección de basura en los sockets.

y más tarde:

Recuerda: No use ni cierre enchufes excepto en el hilo que los creó.

También entendí que el ZeroMQContext es threadsafe.

Si una clase se registra para un evento de otra clase, en .Net, este evento podría invocarse desde un hilo diferente del hilo en el que se creó el oyente.

Creo que solo hay dos opciones para poder enviar algo a través de Sockets ZeroMQ desde un controlador de eventos:

Synchronize el eventhandler-invooking-thread al hilo ZeroMQ-Socket fue creado enCree un nuevo ZeroMQ-Socket / obtén el ZeroMQ- @ existenSocket para el hilo dentro del controlador de eventos utilizando el threadsafe ZeroMQ-Context

Parece que la Guía 0MQ para desalentar la primera y no creo que la creación de un nuevo ZeroMq-Socket para cada subproceso sea eficaz / el camino a seguir.

Mi pregunt:
¿Cuál es el patrón correcto (la forma en que debe ser) para publicar mensajes a través de 0MQ desde un controlador de eventos?

También, ¿tenían en cuenta los autores de la guía ZeroMQ-Binding para .Net cuando escribieron:

El único lugar donde es remotamente sensato compartir sockets entre hilos es en enlaces de idiomas que necesitan hacer magia como la recolección de basura en los sockets. @

Aquí hay un código de muestra para enfatizar mi problema / pregunta:

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?
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta