gpt4 book ai didi

C#:在 Web 服务器上使用 RabbitMQ 消息

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:12 24 4
gpt4 key购买 nike

我正在为 RabbitMQ 使用 C# 客户端。许多示例使用 Console.ReadLine()while(true) 来保持连接打开以使用消息。while(true) 会消耗 CPU 并且 ReadLine() 不适用于网络服务器。

我正在使用 Asp.Net Core 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(); 停止线程,如果我不阻止,我不需要,但如果我必须阻止,这是有帮助的..

我有点困惑我是否应该阻塞,我需要多少线程等等。有什么有用的例子吗?

谢谢..

最佳答案

在控制台应用程序中,如果您不放置诸如 Console.ReadLine 之类的内容 - 进程将在退出主线程时终止(并非总是如此,但这不是这里的重点)。在 web 服务器应用程序中情况并非如此,例如 asp.net(或者更确切地说 - 你不应该为此烦恼,因为它不是由你处理的)。正因为如此——你不需要启动新线程然后通过等待阻塞——它只是没有做任何有用的事情并且消耗一个线程。

因为兔子消费者已经在内部单独的线程上运行,只需删除您的 using block 并在主线程中创建连接和 channel :

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();
}
}

当你完成后(即在你发出事件信号之前)- 只需安排你排队。

关于C#:在 Web 服务器上使用 RabbitMQ 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37917000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com