我不确定这可能是一个更一般的线程问题。
但是我有一个WPF应用程序,该应用程序订阅频道并侦听来自Redis数据库的消息。
App.SubscriptionThread = new Thread(() => { _redisSubscription.SubscribeToChannels("ChannelA", "ChannelB"); }); App.SubscriptionThread.Start();
一旦开始,我不知道如何停止它。
我尝试过的事情。
使用Thread.Abort。显然,这并不能阻止它,因为线程只是挂起然后永远挂掉(没有取消订阅的发生)。
Thread.Abort
使用_redisSubscription.UnSubscribeFromAllChannels()来自UI线程。这也会导致申请者永远进入阻塞状态
_redisSubscription.UnSubscribeFromAllChannels()
使用强制关机Environment.Exit(0)。这似乎可以解决问题。不幸的是,它还具有…嗯…关闭我的应用程序的副作用。
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 处理程序的所有通道的订阅。