一尘不染

Redis Pub / Sub ServiceStack,取消线程

redis

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

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

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

一旦开始,我不知道如何停止它。

我尝试过的事情。

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

  2. 使用_redisSubscription.UnSubscribeFromAllChannels()来自UI线程。这也会导致申请者永远进入阻塞状态

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

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

我通过在新线程中启动SubscribeToChannels做错了吗?


阅读 342

收藏
2020-06-20

共1个答案

一尘不染

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 处理程序的所有通道的订阅。

2020-06-20