Если вы хотите, чтобы код работал на обеих платформах, вам будет гораздо лучше создать слой абстракции, который отображает сообщения и имеет дело с логикой запуска / остановки.
public class RabbitMQManager : IDisposable
{
private bool _disposed = false;
private IModel _channel;
private IConnection _connection;
public event EventHandler<string> MessageReceived;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_channel?.Dispose();
_connection?.Dispose();
}
_disposed = true;
}
}
public void Dispose()
{
Dispose(true);
}
public void Connect()
{
var factory = new ConnectionFactory { HostName = "xxx", UserName = "xxx", Password = "xxx" };
_connection = factory.CreateConnection();
_channel = _connection.CreateModel();
_channel.ExchangeDeclare(exchange: "call_notify", type: "fanout");
string queueName = _channel.QueueDeclare().QueueName;
_channel.QueueBind(queue: queueName,
exchange: "call_notify",
routingKey: "");
var consumer = new EventingBasicConsumer(_channel);
consumer.Received += (model, ea) =>
{
byte[] body = ea.Body;
string message = Encoding.UTF8.GetString(body);
MessageReceived?.Invoke(this, message);
};
_channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
}
}
Затем вы можете использовать это в любом типе проекта, создавая экземпляр класса и подписавшись на событие MessageReceived
. Например, реализация WinForms будет просто:
public class MyForm : Form
{
private RabbitMQManager _rabbitMQManager;
public MyForm() { _rabbitMQManager = new RabbitMQManager(); }
// you can call this from constructor or some event
public void Connect()
{
_rabbitMQManager.MessageReceived = (sender, msg) => someLabel.Text = msg;
_rabbitMQManager.Connect();
}
}
Посмотрите на эти вопросы и ответы, чтобы узнать, как переопределить MyForm.Dispose
, чтобы ресурсы были правильно расположены: Как расширить метод Dispose для WinForm?
А в консольном приложении это может быть просто:
using (var manager = new RabbitMQManager())
{
manager.MessageReceived += (sender, msg) => Console.WriteLine(msg);
manager.Connect();
Console.Read();
}