Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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
C# 收到的不';不要被触发_C#_.net_Rabbitmq - Fatal编程技术网

C# 收到的不';不要被触发

C# 收到的不';不要被触发,c#,.net,rabbitmq,C#,.net,Rabbitmq,我已经将库作为总线共享,并且我正在尝试从rabbitmq接收消息,但是ConsumerOnReceived从未被触发 namespace Bus { public class MessageListener { private static IConnection _connection; private static IModel _channel; public void Start(string hostName, int port, strin

我已经将库作为总线共享,并且我正在尝试从rabbitmq接收消息,但是
ConsumerOnReceived
从未被触发

namespace Bus
{
    public class MessageListener
    {

    private static IConnection _connection;
    private static IModel _channel;

    public void Start(string hostName, int port, string queueName)
    {
        var factory = new ConnectionFactory() { HostName = hostName, Port = port };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: queueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += ConsumerOnReceived;

            channel.BasicConsume(queue: queueName,
                                 noAck: true,
                                 consumer: consumer);
        }
    }

    public static void Stop()
    {
        _channel.Close(200, "Goodbye");
        _connection.Close();
    }

    public virtual void ConsumerOnReceived(object sender, BasicDeliverEventArgs ea)
    {
        var body = ea.Body;
        var message = Encoding.UTF8.GetString(body);
    }
}

public static class MessageSender
{
    public static void Send(string hostName, int port, string queueName, string message)
    {
        var factory = new ConnectionFactory() { HostName = hostName, Port = port };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);

            var body = Encoding.UTF8.GetBytes(message.ToString());

            channel.BasicPublish(exchange: "", routingKey: queueName, basicProperties: null, body: body);
        }
    }
}

}
核心

问题就在这里

channel.BasicConsume(queue: queueName, noAck: true, consumer: consumer);
但是,
BasicConsume
不是一种阻塞方法,因此当您调用
Start
时,您创建了一个连接和一个通道,但随后它会立即被释放

以下内容不是解决方案,但您可以通过执行以下操作进行确认:

channel.BasicConsume(queue: queueName, noAck: true, consumer: consumer);
Console.ReadKey();//←Added Line
您的程序将以这种方式工作

这是我提出的解决方案。请注意
\u channel.BasicConsume(队列:queueName,noAck:true,消费者:消费者)
将在另一个线程上启动,因此在(…)


这确实有效,但是有没有比ReadKey更好的方法来处理这个问题呢?@Mert,我不确定你把
放在哪里,而({u channel.IsOpen){}
但是如果你把它放在
channel.BasicConsume(queue:queueName,noAck:true,consumer:consumer)后面此行;我认为你不需要那个。请看我的最新答案。
channel.BasicConsume(queue: queueName, noAck: true, consumer: consumer);
Console.ReadKey();//←Added Line
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

namespace Bus {

    public abstract class BaseMessageListener {
        private static IModel _channel;
        private static IConnection _connection;

        public abstract void ConsumerOnReceived(object sender, BasicDeliverEventArgs ea);

        public void Start(string hostName, int port, string queueName) {
            var factory = new ConnectionFactory() { HostName = hostName, Port = port };
            _connection = factory.CreateConnection();
            _channel = _connection.CreateModel();
            _channel.QueueDeclare(queue: queueName, durable: false, exclusive: false, autoDelete: false);
            var consumer = new EventingBasicConsumer(_channel);
            consumer.Received += ConsumerOnReceived;
            _channel.BasicConsume(queue: queueName, noAck: true, consumer: consumer);//This will start another thread!
        }

        public void Stop() {
            _channel.Close(200, "Goodbye");
            _connection.Close();
        }
    }
}

namespace StackOverfFLow.RabbitMQSolution {

    using Bus;

    public class MessageListener : BaseMessageListener {

        public override void ConsumerOnReceived(object sender, BasicDeliverEventArgs ea) {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(message);
        }
    }

    internal class Program {

        private static void Main(string[] args) {
            var listener = new MessageListener();
            listener.Start("localhost", 5672, "MakePayment");
            Console.WriteLine("Core Service Started!");
            Console.ReadKey();
            listener.Stop();
        }
    }
}