我不确定这可能是一个更一般的线程问题。
但是我有一个 WPF 应用程序可以订阅 channel 并监听来自 redis 数据库的消息。
App.SubscriptionThread = new Thread(() =>
{
_redisSubscription.SubscribeToChannels("ChannelA", "ChannelB");
});
App.SubscriptionThread.Start();
一旦开始,我就不知道如何停止。
我尝试过的事情。
使用
Thread.Abort
。这显然不会阻止它,因为线程会永远挂起(不会发生取消订阅)。使用来自 UI 线程的
_redisSubscription.UnSubscribeFromAllChannels()
。这也导致应用程序永远进入阻塞状态使用
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 处理程序取消订阅所有 channel 。
关于c# - Redis Pub/Sub ServiceStack,取消线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204839/