我问了一个问题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
来限制并发线程的数量。