0MQ: Como usar o ZeroMQ de maneira segur

Eu li oZeroMq guide e me deparei com o seguinte:

Você NÃO DEVE compartilhar soquetes ØMQ entre as roscas. Os soquetes ØMQ não são seguros para roscas. Tecnicamente, é possível fazer isso, mas exige semáforos, bloqueios ou mutexes. Isso tornará seu aplicativo lento e frágil. O único lugar em que é remotamente sensato compartilhar soquetes entre threads é em ligações de idiomas que precisam fazer mágica como coleta de lixo nos soquete

e mais tarde:

Lembrar: Não use nem feche soquetes, exceto no segmento que os crio

Eu também entendi que o ZeroMQContext é thread-safe.

Se uma classe se registrar para um evento de outra classe, em .Net, esse evento poderá ser chamado de um thread diferente do segmento em que o ouvinte foi criad

Acho que existem apenas duas opções para poder enviar algo via ZeroMQ-Sockets de dentro de um manipulador de eventos:

Sincronize o thread do manipulador de eventos com o thread ZeroMQ-Socket foi criado emCrie um novo ZeroMQ-Socket / obtenha o ZeroMQ- @ existenSocket para o encadeamento dentro do manipulador de eventos usando o Threadsafe ZeroMQ-Context

Parece que o 0MQ-Guide desencoraja o primeiro e não acho que a criação de um novo ZeroMq-Socket para cada thread seja um desempenho / o caminho a seguir.

Minha pergunt:
Qual é o padrão correto (da maneira como deve ser) para publicar mensagens via 0MQ de dentro de um manipulador de eventos?

Além disso, os autores do guia tiveram em mente o ZeroMQ-Binding for .Net quando escreveram:

O único lugar em que é remotamente sensato compartilhar soquetes entre threads é em ligações de idiomas que precisam fazer mágica como coleta de lixo nos soquetes. ?

Aqui está um código de exemplo para enfatizar meu problema / pergunta:

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

questionAnswers(3)

yourAnswerToTheQuestion