Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net RabbitMQ点网客户端';s EventingBasicConsumer.Received不能同时触发多次?_.net_Rabbitmq - Fatal编程技术网

.net RabbitMQ点网客户端';s EventingBasicConsumer.Received不能同时触发多次?

.net RabbitMQ点网客户端';s EventingBasicConsumer.Received不能同时触发多次?,.net,rabbitmq,.net,Rabbitmq,我使用RabbitMQ.Client(我从NuGet获得)访问RabbitMQ。这是我的信息消费者代码: const string EXCHANGE_NAME = "EXCHANGE3"; ConnectionFactory factory = new ConnectionFactory(); using (IConnection connection = factory.CreateConnection()) { usin

我使用RabbitMQ.Client(我从NuGet获得)访问RabbitMQ。这是我的信息消费者代码:

        const string EXCHANGE_NAME = "EXCHANGE3";
        ConnectionFactory factory = new ConnectionFactory();
        using (IConnection connection = factory.CreateConnection()) {
            using (IModel channel = connection.CreateModel()) {
                channel.ExchangeDeclare(EXCHANGE_NAME, ExchangeType.Topic, false, true, null);
                string queueName = channel.QueueDeclare();
                channel.BasicQos(0, 4, false); //I want to handle 4 messages simultaneously
                EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                consumer.Received += (o, e) => {
                    string data = Encoding.ASCII.GetString(e.Body);
                    Console.WriteLine("received: " + data);
                    Thread.Sleep(1000);
                    Console.WriteLine("done."); //Received event will not be fired again before done.
                };

                string consumerTag = channel.BasicConsume(queueName, true, consumer);

                channel.QueueBind(queueName, EXCHANGE_NAME, "myTopic");
                Console.WriteLine("Listening press ENTER to quit");
                Console.ReadLine();
                channel.QueueUnbind(queueName, EXCHANGE_NAME, "myTopic", null);
            }
        }

它几乎是从RabbitMQ的官方教程中复制的。请注意,我使用了Sleep方法来模拟长时间任务,并且我发现接收到的事件不能同时触发。换句话说,我只能一个接一个地处理消息,这不是我想要的。我怎样才能使它正确呢?

我们的解决方案基本上是:

consumer.Received += (o,e) => {
    // setup...
    Task.Factory.StartNew(() =>
    {
        // real work done here
    });
};

也就是说,使用者启动新线程/任务(达到一定限制)。为了简单起见,我省略了任务计数限制逻辑等。

您找到解决方案了吗?