Redis Pub / Sub ServiceStack,取消线程

这可能是一个更通用的线程问题,我不确定。

但我有一个WPF应用程序订阅频道并侦听来自redis数据库的消息。

App.SubscriptionThread = new Thread(() => { _redisSubscription.SubscribeToChannels("ChannelA", "ChannelB"); }); App.SubscriptionThread.Start(); 

一旦我开始这个,我不知道如何阻止它。

我尝试过的事情。

  1. 使用Thread.Abort 。 这显然不会阻止它,因为线程只是永远挂起(没有取消订阅)。

  2. 使用UI线程中的_redisSubscription.UnSubscribeFromAllChannels() 。 这也导致应用程序永远进入阻塞状态

  3. 使用Environment.Exit(0)强制关闭。 这个似乎可以解决问题。 不幸的是它也有……好……关闭我的应用程序的副作用。

如何停止聆听,我可以随意连接/重新连接?

我是通过在新线程中启动SubscribeToChannels来做错的吗?

显示如何订阅和取消订阅消息的示例位于RedisMqServer中 ,例如:

 using (var subscription = redisClient.CreateSubscription()) { subscription.OnUnSubscribe = channel => Log.Debug("OnUnSubscribe: " + channel); subscription.OnMessage = (channel, msg) => { if (msg == "STOP") { Log.Debug("Stop Command Issued"); Log.Debug("Unsubscribing from all Channels..."); subscription.UnSubscribeFromAllChannels(); //Unblocks thread. } }; subscription.SubscribeToChannels(QueueNames.TopicIn); //blocks thread } 

它使用自定义控件消息来取消阻止后台线程并取消订阅订阅OnMessage处理程序中的所有通道。