C# 如何正确处置SimpleRpcServer对象?
我有一个RabbitMQ SimpleRpcServer,我想知道在使用完它后如何正确地处理它。该模式有一个主循环,该循环会一直阻塞,直到收到消息,处理消息,然后再次阻塞。这意味着为了中断循环,我必须发送一条特殊编码的消息,处理程序可以使用该消息中断循环 我已经读到RabbitMQ通道应该从创建它们的同一线程访问。如果这是真的(我找不到源),这是否意味着要处置我的SimpleRpcServer,我必须专门创建一个新通道以将关闭消息发送到主循环 以下是伪代码: 主循环(): 处理程序:C# 如何正确处置SimpleRpcServer对象?,c#,rabbitmq,dispose,C#,Rabbitmq,Dispose,我有一个RabbitMQ SimpleRpcServer,我想知道在使用完它后如何正确地处理它。该模式有一个主循环,该循环会一直阻塞,直到收到消息,处理消息,然后再次阻塞。这意味着为了中断循环,我必须发送一条特殊编码的消息,处理程序可以使用该消息中断循环 我已经读到RabbitMQ通道应该从创建它们的同一线程访问。如果这是真的(我找不到源),这是否意味着要处置我的SimpleRpcServer,我必须专门创建一个新通道以将关闭消息发送到主循环 以下是伪代码: 主循环(): 处理程序: priva
private void ProcessRequest(evt)
{
if(evt.BasicProperties.ContentType == "close") //close flag
{
base.Close();
}
else
{
//process message
}
}
处置代码(创建专门用于取消主循环的新通道):
注意,我遗漏了一些初始化和处理代码。我知道这段代码无法编译。是的,您不应该在两个或多个线程之间共享通道,请阅读这里的“2.10.IModel不应该在线程之间共享” 要关闭频道,您可以使用频道创建订阅线程,然后在主线程上关闭频道,如下所示: 初始化连接、通道等
ConnectionFactory connection_factory = new ConnectionFactory();
IConnection conn = null;
IModel channel = null;
Subscription sub = null;
private void Connect()
try
{
conn = connection_factory.CreateConnection();
channel = conn.CreateModel();
sub = new Subscription(channel, your_queue, true);
StartSubscribeThread (sub);
….
创建您的线程:
public void StartSubscribeThread(Subscription sub)
{
var t = new Thread(() => InternalStartSubscriber(sub));
t.Start();
}
private void InternalStartSubscriber(Subscription sub)
{
foreach (BasicDeliverEventArgs e in sub)
{
//Handle your messages
}
}
最后:
private void Disconnet()
sub.Close();
channel.Close();
channel.Dispose();
这样可以避免创建另一个通道来关闭第一个通道
public void StartSubscribeThread(Subscription sub)
{
var t = new Thread(() => InternalStartSubscriber(sub));
t.Start();
}
private void InternalStartSubscriber(Subscription sub)
{
foreach (BasicDeliverEventArgs e in sub)
{
//Handle your messages
}
}
private void Disconnet()
sub.Close();
channel.Close();
channel.Dispose();