There appears to be a deadlock if you attempt to dispose, close, or abort a channel within the context of an IConnection.ConnectionShutdown event. &nbsp;Here's an example client that should demonstrate the issue:<div><br></div><div>RabbitService.cs (needs to run as admin to shut down the Windows service)</div><div>-------------------------</div><div><div>using System;</div><div>using System.ServiceProcess;</div><div><br></div><div>namespace Consumer</div><div>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>public class RabbitService</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>public void Restart()</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>var serviceController = new ServiceController("RabbitMQ", "localhost");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>TimeSpan timeout = TimeSpan.FromMilliseconds(20000);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;Stopping RabbitMQ service ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.Stop();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;RabbitMQ service stopped.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;Starting RabbitMQ service ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.Start();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.WaitForStatus(ServiceControllerStatus.Running, timeout);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;RabbitMQ service started.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>public void Start()</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>var serviceController = new ServiceController("RabbitMQ", "localhost");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>TimeSpan timeout = TimeSpan.FromMilliseconds(20000);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;Starting RabbitMQ service ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.Start();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.WaitForStatus(ServiceControllerStatus.Running, timeout);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;RabbitMQ service started.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>public void Stop()</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>var serviceController = new ServiceController("RabbitMQ", "localhost");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>TimeSpan timeout = TimeSpan.FromMilliseconds(20000);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;Stopping RabbitMQ service ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.Stop();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine(" &nbsp;RabbitMQ service stopped.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div>}</div></div><div><br></div><div>ConsumerProgram.cs</div><div>--------------------------------</div><div><div>using System;</div><div>using System.Diagnostics;</div><div>using System.IO;</div><div>using System.Text;</div><div>using System.Threading;</div><div>using RabbitMQ.Client;</div><div>using RabbitMQ.Client.Events;</div><div><br></div><div>namespace Consumer</div><div>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>class Program</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>const string Id = "2BD27137-9AE3-4342-B4C3-9DEC20D203DF";</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>static Thread _thread;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>static bool _threadCancelled;</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>static void Main(string[] args)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>IConnection connection = new ConnectionFactory().CreateConnection();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>connection.ConnectionShutdown += ConnectionShutdown;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>SubscribeToQueue(connection);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine("Press a key to restart the RabbitMQ service ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.ReadKey();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>new RabbitService().Restart();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine("Press a key to stop subscription ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.ReadKey();</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>if (connection.IsOpen)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                </span>connection.Close();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>static void ConnectionShutdown(IConnection connection, ShutdownEventArgs reason)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine("Connection was shut down");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>Console.WriteLine("Sending the signal to cancel the thread ...");</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>// Setting _threadCancelled to true here causes a deadlock.</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>_threadCancelled = true;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>_thread.Join();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>static void SubscribeToQueue(IConnection connection)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>_thread = new Thread(() =&gt;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>IModel channel = connection.CreateModel();</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>channel.ExchangeDeclare(Id, ExchangeType.Direct, false, true, null);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>channel.QueueDeclare(Id, false, false, true, null);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>channel.QueueBind(Id, Id, "");</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>var consumer = new QueueingBasicConsumer(channel);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>channel.BasicConsume(Id, true, consumer);</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>while (true)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>if (_threadCancelled)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>Console.WriteLine("Received signal to cancel this thread.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>_threadCancelled = false;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>break;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>BasicDeliverEventArgs eventArgs = null;</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>try</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>object eArgs = null;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>consumer.Queue.Dequeue(10, out eArgs);</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>if (eArgs != null)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                                </span>eventArgs = (BasicDeliverEventArgs) eArgs;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                                </span>string message = Encoding.UTF8.GetString(eventArgs.Body);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                                </span>Console.WriteLine("Message: " + message);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>catch (EndOfStreamException)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>// Never happens</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>Console.WriteLine("Caught EndOfStreamException");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>channel.Dispose();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>channel = null;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>break;</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>catch (Exception e)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                        </span>Console.WriteLine("An exception occurred while dequeuing a message: " + e.Message, TraceEventType.Error);</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>if (channel != null &amp;&amp; channel.IsOpen)</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>{</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>Console.WriteLine("Closing channel ...");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>channel.Close(); // &lt;- Never returns</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                                </span>Console.WriteLine("Channel closed.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                                        </span>Console.WriteLine("End of thread execution.");</div><div><span class="Apple-tab-span" style="white-space: pre; ">                                </span>});</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>_thread.Start();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>}</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div>}</div></div>