2016-06-20 8 views
2

私はRabbitMQ用のC#Clientを使用しています。 多くの例では、接続を開いたままにしてメッセージを消費するために、Console.ReadLine()またはwhile(true)を使用しています。 while(true)はCPUを焼き付け、ReadLine()はウェブサーバーに実際には適用できません。C#:Webサーバ上のRabbitMQメッセージの使用

私はAsp.NetコアWebサービスを使用しており、いくつかのテストを作成しようとしています。私のサーバの起動方法で は、私はどこでも、このタスクを待っていないよ

Task.Factory.StartNew(() => 
     { 
      using (IConnection connection = _connectionFactory.CreateConnection()) 
      { 
       using (IModel channel = connection.CreateModel()) 
       { 
        // configuring queue etc.... 
        options.DeclareConsumer(queueName, MessageReceived); 

        ResetEvent.WaitOne(); 
       } 
      } 
     }); 

これを呼び出します。私のウェブサーバに依頼して依頼を依頼したいのです。私の統合テストで

私はその後、私はブロックをいけないが、私はブロックする必要がある場合に便利であるならば、私は必要のないものをMailMessageQueue.ResetEvent.Set();とのスレッドを停止することができるだろう。..

私は私であれば、多少混乱していますブロックするかどうか、必要なスレッド数など どこか便利な例がありますか?あなたがConsole.ReadLineのようなものを入れていない場合は、コンソールアプリケーションで..

答えて

1

おかげで、 - それはメインスレッドを終了すると、プロセスは(常にではないが、それはここでのポイントはありません)に終了します。これはasp.netのようなWebサーバーアプリケーションでは当てはまりません(またはむしろ、あなたが処理していないので、気にする必要はありません)。そのため、新しいスレッドを開始して待つことでブロックする必要はありません。ただ役に立ちませんし、1つのスレッドを消費します。

ウサギの消費者はすでに内部で別のスレッドで実行されるため、ちょうどあなたがブロックを使用し、メインスレッドでの接続とチャンネルを作成、削除:

作業が完了し
class MailMessageQueue : IDisposable { 
    private IConnection _connection; 
    private IModel _channel; 

    public void Start() { 
     _connection = _connectionFactory.CreateConnection(); 
     _channel = connection.CreateModel(); 
     // configuring queue etc.... 
     options.DeclareConsumer(queueName, MessageReceived); 
    } 

    public void Stop() { 
     _channel.Dispose(); 
     _connection.Dispose(); 
    } 

    public void Dispose() { 
     Stop(); 
    } 
} 

(それがあるときに、あなたのイベントに信号を送る前に) - あなただけのキューを処分してください。

+0

ありがとうございました。これを試して、有望に見える:) – Senj

関連する問題