我正在使用RabbitMQ的C#Client。
许多示例使用Console.ReadLine()
或while(true)
来保持连接打开以使用消息。
while(true)
将刻录CPU,ReadLine()
不适用于Web服务器。
我正在使用Asp.Net核心Web服务并尝试为其编写一些测试。 在我的服务器的启动方法中,我称之为
Task.Factory.StartNew(() =>
{
using (IConnection connection = _connectionFactory.CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
// configuring queue etc....
options.DeclareConsumer(queueName, MessageReceived);
ResetEvent.WaitOne();
}
}
});
我不是在等任何地方等待这项任务。因为我希望我的网络服务器仍然可以提供请求。
在我的集成测试中,我可以使用MailMessageQueue.ResetEvent.Set();
来阻止线程,如果我不阻止,我不需要,但如果我必须阻止它会有帮助。
我有点困惑,如果我应该阻止或不,我需要多少线程等。 某处有一个有用的例子吗?
感谢..
答案 0 :(得分:1)
在控制台应用程序中,如果你没有放置像Console.ReadLine
这样的东西 - 进程将在它退出主线程时终止(并非总是如此,但这不是重点)。在Web服务器应用程序中不是这种情况,例如asp.net(或者更确切地说 - 你不应该为此烦恼,因为它不是你处理的)。因此 - 您不需要启动新线程然后通过等待阻塞 - 它只是没有用处并消耗一个线程。
因为兔子消费者已在内部运行在单独的线程上,只需删除你的使用块并在主线程中创建连接和通道:
class MailMessageQueue : IDisposable {
private IConnection _connection;
private IModel _channel;
public void Start() {
_connection = _connectionFactory.CreateConnection();
_channel = connection.CreateModel();
// configuring queue etc....
options.DeclareConsumer(queueName, MessageReceived);
}
public void Stop() {
_channel.Dispose();
_connection.Dispose();
}
public void Dispose() {
Stop();
}
}
当你完成时(也就是你发出事件之前的时间) - 只需将你排队。