C# netMQ 4.0多线程

C# netMQ 4.0多线程,c#,.net,multithreading,zeromq,netmq,C#,.net,Multithreading,Zeromq,Netmq,我对基于netmq4.0的多线程服务器有一些问题。我尝试使用http://zguide.zeromq.org/cs:mtserver,但在netMQ 4.0上没有上下文 我试过: for (var i = 0; i < workerCount; ++i) { new Thread(() => Worker(connStr.Value)).Start(); } //... private void Worker(string connStr) { using (var

我对基于
netmq4.0
的多线程服务器有一些问题。我尝试使用
http://zguide.zeromq.org/cs:mtserver
,但在
netMQ 4.0
上没有上下文

我试过:

for (var i = 0; i < workerCount; ++i)
{
    new Thread(() => Worker(connStr.Value)).Start();
}

//...
private void Worker(string connStr)
{
    using (var socket = new DealerSocket(connStr))
    {
        while (true)
        {
            var msg = socket.ReceiveMultipartMessage();
            //...
        }
    }
}
for(变量i=0;iWorker(connStr.Value)).Start();
}
//...
私有void Worker(字符串connStr)
{
使用(var套接字=新的DealerSocket(connStr))
{
while(true)
{
var msg=socket.ReceiveMultipartMessage();
//...
}
}
}
但我得到了一个错误:

NetMQ.TerminationException:CheckContextTerminated

是的,它被终止了

如何在
netMQ 4.0
中创建上下文,或者如何使用
netMQ 4.0
创建多线程服务器?

正确的解决方案:

using (var clients = new RouterSocket(connStr.Value))
using (var workers = new DealerSocket())
    {
        workers.Bind("inproc://workers");
            for (var i = 0; i < workerCount; i++)
            {
                new Thread(Worker).Start();
            }
            var prx = new Proxy(clients, workers);
            prx.Start();
            }

private void Worker()
    {
        using (var socket = new ResponseSocket())
        {
            socket.Connect("inproc://workers");
            while (true)
            {
                 //...
            }
        }
    }
使用(var客户端=新RouterSocket(connStr.Value))
使用(var workers=new DealerSocket())
{
工人。绑定(“inproc://workers");
对于(变量i=0;i
如果您使用的是
.NET
版本4.0或更高版本,那么
线程
创建方法已经过时,不应该以这种方式使用-如果您的
workerCount
足够高,并且您没有提供任何调度程序逻辑,那么您的性能可能会显著降低,而不是受益

您可以使用以下方法来替代您的方法:

  • 您可以轻松地将辅助线程替换为
  • 您可能应该为您的员工介绍正确的方法来阻止他们
  • 所以你的代码可以是这样的:

    /// field in your class
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    
    using (var clients = new RouterSocket(connStr.Value))
    using (var workers = new DealerSocket())
    {
        workers.Bind("inproc://workers");
        for (var i = 0; i < workerCount; ++i)
        {
            Task.Factory.StartNew(Worker
                , cancellationTokenSource.Token
                , TaskCreationOptions.LongRunning
                , TaskScheduler.Default);
        }
        var prx = new Proxy(clients, workers);
        prx.Start();
    }
    
    private void Worker()
    {
        using (var socket = new ResponseSocket())
        {
            socket.Connect("inproc://workers");
            while (!cancellationTokenSource.Token.IsCancellationRequested)
            {
                 //...
            }
            // Cancel the task and exit
            cancellationTokenSource.Token.ThrowIfCancellationRequested();
        }
    }
    
    ///类中的字段
    CancellationTokenSource CancellationTokenSource=新的CancellationTokenSource();
    使用(var客户端=新RouterSocket(connStr.Value))
    使用(var workers=new DealerSocket())
    {
    工人。绑定(“inproc://workers");
    对于(变量i=0;i
    为了简化它,您可以将
    CancellationToken
    作为参数传递给
    Worker
    方法