【发布时间】:2017-02-16 22:14:15
【问题描述】:
我问了一个问题here,关于为什么使用 Thread.Run 启动进程没有执行我预期的那么多并发请求。
这个问题背后的原因是我试图创建一个类,它可以从 rabbitmq 队列中提取消息并同时处理它们,最多可以同时处理最大数量的并发消息。
为此,我在 EventingBasicConsumer 类的 Received 处理程序中完成了以下操作。
async void Handle(EventArgs e)
{
await _semaphore.WaitAsync();
var thread = new Thread(() =>
{
Process(e);
_semaphore.Release();
_channel.BasicAck(....);
});
thread.Start();
}
然而,上一篇文章中的 cmets 除非做 CPU 密集型工作,否则不会启动线程。
上述处理程序不知道工作是否会受到 CPU 限制、网络、磁盘或其他方面的限制。 (Process 是一个抽象方法)。
即便如此我觉得还是要在这里启动一个线程或任务,否则Process方法会阻塞rabbitmq线程,直到完成后才会再次调用事件处理程序。所以我一次只能处理一种方法。
在这里开始一个新的Thread 好吗?最初我使用了Task.Run,但这并没有产生所需的工人数量。见其他帖子。
仅供参考。通过在信号量上设置InitialCount 来限制并发线程的数量。
【问题讨论】:
标签: c# multithreading rabbitmq