2016-06-20 43 views
2

我正在使用C#Client for RabbitMQ。 許多示例使用Console.ReadLine()while(true)來保持連接打開以使用消息。 while(true)會燒燬CPU,並且ReadLine()不適用於Web服務器。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();線程我,如果我不塊,但是是有幫助的,如果我必須阻止不需要..

我,如果我有些困惑應該阻止或不需要,我需要多少線程等。 有沒有一個有用的例子嗎?

感謝..

回答

1

在控制檯應用程序,如果你不把像Console.ReadLine - 當它退出主線程的進程將終止(並非總是如此,但在這裏,這不是問題的關鍵)。 Web服務器應用程序中並不是這種情況,比如asp.net(或者說 - 你不應該爲此煩惱,因爲它不是由你來處理的)。正因爲如此 - 你不需要開始新的線程,然後通過等待來阻止它 - 它只是沒有用處並且消耗一個線程。

由於兔子的消費者已經在單獨的線程運行在內部,使用塊和創建主線程的連接和頻道您只是刪除:

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

相關問題