ZeroMQ を使用してメッセージを送受信する単純なコンソール アプリケーションがあります。受信部分には、次のメッセージ ポンプ コードがあります。
ZMQ.Context _context = new ZMQ.Context(1);
ZMQ.PollItem[] pollItems = new ZMQ.PollItem[0];
while (!_finished)
{
if (pollItems.Length > 0)
context.Poll(pollItems, pollTimeout);
else
Thread.Sleep(1);
if (_receiversChanged)
UpdatePollItems(ref pollItems);
}
(レシーバーを追加する必要があるため、実行時にポーラーからアイテムを追加および削除できるという考え方です。UpdatePollItems は、レシーバーのセットが変更されるたびに新しい配列を作成するだけです。)
pollTimeout の値を 50ms と 500ms にしてみましたが、アプリ (Console.ReadKey のメイン スレッドにある) は、メッセージが送信されていない場合でも、1 つのコアを 100% 使用します。プロファイラーの下でアプリを実行し、すべての CPU をかみ砕いているのが ZMQ.Context.Poller であることを確認しました。
他の人も同様の行動を見たことがありますか? 最新の ZeroMQ C# バインディング (NuGet の clrzmq-x64.2.2.3) を使用しています。