c# - Redis Pub/Sub ServiceStack,取消线程

标签 c# multithreading redis servicestack publish-subscribe

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

但是我有一个 WPF 应用程序可以订阅 channel 并监听来自 redis 数据库的消息。

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

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

我尝试过的事情。

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

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

  3. 使用 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/

相关文章:

c# - 通过提供代理 token 处理来自 webapi 的长承载 token

c++ - 我应该如何在 C++ 中实现线程池?

Redis "Fatal error, can' t open config file 'restart' "after a crash

caching - Redis 缓存驱动程序在 PHPUnit 中抛出异常

c# - 在 C# 中替代 ">"on String 就像在 Powershell 中一样?

c# - 遵循 MVVM 在 WPF 应用程序中集成上下文相关帮助

java - 并发性 - 初始化启动线程之间的差异

android - 从异步线程访问 UI 线程

amazon-web-services - 哪个哈希键最适合 DynamoDB 中的事件数据?

c# - 我什么时候不应该实现 IDisposable?