我不确定这可能是一个更一般的线程问题。
但是我有一个WPF应用程序,该应用程序订阅频道并侦听来自Redis数据库的消息。
App.SubscriptionThread = new Thread(() =>
{
_redisSubscription.SubscribeToChannels("ChannelA", "ChannelB");
});
App.SubscriptionThread.Start();
一旦开始,我不知道如何停止它。
我尝试过的事情。
使用Thread.Abort
。显然,这并不能阻止它,因为线程只是挂起然后永远挂掉(没有取消订阅的发生)。
使用_redisSubscription.UnSubscribeFromAllChannels()
来自UI线程。这也导致申请永远进入阻塞状态
使用强制关机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处理程序的所有通道的订阅。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句