2016-12-01 4 views
1

netMQ 4.0に基づいてマルチスレッドサーバに問題があります。 http://zguide.zeromq.org/cs:mtserverを使用しようとしましたが、netMQ 4.0にはコンテキストがありません。 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を使用してマルチスレッドサーバーを作成するにはどうすればよいですか?

答えて

1

Thread作成アプローチは時代遅れであり、そのような方法で使用されるべきではない - あなたworkerCountは十分に高く、あなたが上がらない場合スケジューラロジックを提供していないと、パフォーマンスが利益の代わりに大幅に低下する可能性があります。

これは、あなたはTPLを使用して代わりにあなたのアプローチを行うことができます。

  1. あなたは簡単にLongRunning tasksであなたのワーカースレッドを置き換えることができます。
  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(); 
    } 
} 

あなたWorkerメソッドのパラメータとしてCancellationTokenを渡すことができ、それを簡素化します。

1

正解:あなたは.NETバージョン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) 
      { 
       //... 
      } 
     } 
    }