C# 如何正确处置SimpleRpcServer对象?

C# 如何正确处置SimpleRpcServer对象?,c#,rabbitmq,dispose,C#,Rabbitmq,Dispose,我有一个RabbitMQ SimpleRpcServer,我想知道在使用完它后如何正确地处理它。该模式有一个主循环,该循环会一直阻塞,直到收到消息,处理消息,然后再次阻塞。这意味着为了中断循环,我必须发送一条特殊编码的消息,处理程序可以使用该消息中断循环 我已经读到RabbitMQ通道应该从创建它们的同一线程访问。如果这是真的(我找不到源),这是否意味着要处置我的SimpleRpcServer,我必须专门创建一个新通道以将关闭消息发送到主循环 以下是伪代码: 主循环(): 处理程序: priva

我有一个RabbitMQ SimpleRpcServer,我想知道在使用完它后如何正确地处理它。该模式有一个主循环,该循环会一直阻塞,直到收到消息,处理消息,然后再次阻塞。这意味着为了中断循环,我必须发送一条特殊编码的消息,处理程序可以使用该消息中断循环

我已经读到RabbitMQ通道应该从创建它们的同一线程访问。如果这是真的(我找不到源),这是否意味着要处置我的SimpleRpcServer,我必须专门创建一个新通道以将关闭消息发送到主循环

以下是伪代码:

主循环():

处理程序:

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