1

我对基于netMQ 4.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();
            //...
        }
    }
}

但我得到错误:

NetMQ.TerminatingException: CheckContextTerminated

是的,它被终止了。

如何创建上下文netMQ 4.0或如何使用创建多线程服务器netMQ 4.0

4

2 回答 2

1

如果您使用的是.NET4.0 或更高版本,则Thread创建方法已经过时,不应该以这种方式使用 - 如果您workerCount足够高并且您没有提供任何调度程序逻辑,那么您的性能可能会显着降低而不是受益。

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

  1. LongRunning您可以轻松地用任务替换您的工作线程。
  2. 您可能应该CancellationToken为您的工人介绍 以正确阻止他们。

所以你的代码可能是这样的:

/// 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();
    }
}

为了简化它,您可以将CancellationToken作为参数传递给您的Worker方法。

于 2016-12-02T16:21:55.130 回答
1

正确的解决方案:

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)
            {
                 //...
            }
        }
    }
于 2016-12-01T12:22:48.990 回答