【发布时间】:2019-05-26 06:17:07
【问题描述】:
我有一个用 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
}
}
【问题讨论】:
-
Windows 应用程序和控制台应用程序并不相互排斥...
-
在 Winforms 应用程序中单击主窗口的关闭按钮相当于在控制台模式应用程序中按 Enter。不清楚你为什么点击它。如果您不创建 Form 对象并且只使用 Application.Run() 而不使用参数,那么它将永远运行并且只能通过任务管理器终止。您应该将其作为一项服务的可能性很高。
标签: c# multithreading rabbitmq