Redis Pub/Sub ServiceStack,取消线程

Kyl*_*bel 6 c# multithreading publish-subscribe redis servicestack

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

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

 App.SubscriptionThread = new Thread(() =>
 {
     _redisSubscription.SubscribeToChannels("ChannelA", "ChannelB");
 });
 App.SubscriptionThread.Start();
Run Code Online (Sandbox Code Playgroud)

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

我尝试过的事情.

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

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

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

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

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

myt*_*thz 4

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
}
Run Code Online (Sandbox Code Playgroud)

它使用自定义控制消息来解锁后台线程并从订阅OnMessage处理程序中取消订阅所有频道。