首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >netMQ 4.0多线程

netMQ 4.0多线程
EN

Stack Overflow用户
提问于 2016-12-01 09:46:53
回答 2查看 1.7K关注 0票数 1

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

我试过:

代码语言:javascript
复制
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创建多线程服务器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-02 16:21:55

如果您使用的是.NET version 4.0或更高版本,那么Thread创建方法已经过时,不应该以这种方式使用--如果您的workerCount足够高,并且没有提供任何调度程序逻辑,那么您的性能可能会显著下降,而不是带来好处。

您可以使用第三方物流来代替您的方法

  1. 您可以轻松地用任务替换您的工作线程。
  2. 您可能应该为您的员工引入CancellationToken,以正确地阻止他们。

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

代码语言:javascript
复制
/// 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方法。

票数 1
EN

Stack Overflow用户

发布于 2016-12-01 12:22:48

正确的解决方案:

代码语言:javascript
复制
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)
            {
                 //...
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40907244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档