C#中如何避免线程完成?

Fai*_*aiz 4 c# multithreading rabbitmq

我有一个用 C# 编写的 RabbitMQ 客户端程序。虽然应用程序在基于控制台的应用程序中工作(因为执行被 Console.ReadLine 阻止),但它在基于 Windows 窗体的应用程序中不起作用。在 Windows 窗体应用程序中,执行不会等待 Console.ReadLine 并在完成时终止。我正在寻找解决方案,让我的侦听器持续监视来自服务器的新消息而不被终止。这是客户端代码:

    try {
            var factory = new ConnectionFactory() { HostName = "xxx" , UserName ="xxx", Password="xxx"};
            using(var connection = factory.CreateConnection())
            using(var channel = connection.CreateModel())
            {
                channel.ExchangeDeclare(exchange: "call_notify", type: "fanout");

                var queueName = channel.QueueDeclare().QueueName;
                channel.QueueBind(queue: queueName,
                                  exchange: "call_notify",
                                  routingKey: "");

                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine(message);
                };
                channel.BasicConsume(queue: queueName,
                                     autoAck: true,
                                     consumer: consumer);

                Console.WriteLine(" Press [enter] to exit.");
                Console.ReadLine();  // Program does'nt wait here in windows form based application
            }
        }
Run Code Online (Sandbox Code Playgroud)

Sam*_*nen 5

  1. 不要使用,using因为这会立即处理掉所有东西
  2. 将所需的对象(连接?通道?消费者?)存储在类字段中而不是局部变量中
  3. 不需要线程,因为对象异步处理事物。只需创建对象即可
  4. 当应用程序终止或您需要停止监听时关闭/处置对象

这样它们就会一直存在,直到应用程序终止。