我問了一個問題here關於爲什麼使用Thread.Run啓動一個進程並沒有像我期望的那樣執行儘可能多的併發請求。同時處理rabbitmq消息
這個問題背後的原因是我試圖創建一個類,它可以將消息從rabbitmq隊列中拉出並同時處理它們達到最大併發消息數。
爲此,我在EventingBasicConsumer
類的Received
處理程序中結束了以下操作。
async void Handle(EventArgs e)
{
await _semaphore.WaitAsync();
var thread = new Thread(() =>
{
Process(e);
_semaphore.Release();
_channel.BasicAck(....);
});
thread.Start();
}
但是,對上一篇文章的評論並不是要啓動一個線程,除非進行CPU綁定工作。
上述處理程序不知道該作品是CPU綁定,網絡,磁盤還是其他。 (Process
是一種抽象方法)。
即使如此,我認爲我必須在這裏啓動一個線程或任務,否則Process
方法會阻塞rabbitmq線程,並且在完成之前不會再調用該事件處理程序。所以我只能一次處理一種方法。
在這裏開始一個新的Thread
好嗎?最初我曾經使用過Task.Run
,但是這並沒有產生儘可能多的工人。查看其他帖子。
僅供參考。通過在信號量上設置InitialCount
來限制併發線程的數量。