当前位置: 首页 > 面试题库 >

Redis Pub / Sub ServiceStack,取消线程

张鸿志
2023-03-14
问题内容

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

但是我有一个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做错了吗?


问题答案:

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



 类似资料:
  • 取消验证也被称为解除身份验证攻击。这种攻击非常有用,这种攻击允许我们断开任何设备与范围内的任何网络的连接,即使网络具有加密或使用密钥。 在解除身份验证攻击攻击中,我们假装是客户端并通过将我们的MAC地址更改为客户端的MAC地址,并向路由器发送我们想要断开连接的路由器来向路由器发送解除认证数据包。与此同时,我们将伪装成路由器,将我们的MAC地址更改为路由器的MAC地址,直到我们请求断开连接的客户端为

  • 问题内容: 如何在AngularJs中取消路线更改事件? 我当前的代码是 即使验证失败,Angular也会提取下一个模板和关联的数据,然后立即切换回上一个视图/路线。如果验证失败,我不希望angular提取下一个模板和数据,理想情况下应该没有window.history.back()。我什至尝试过event.preventDefault()但没有用。 问题答案: 代替使用 这是angularjs专

  • 请求地址 https://api.es.xiaojukeji.com/river/Approval/cancel 返回数据格式 JSON 请求类型 POST 请求参数 参数名称 数据类型 必选 说明 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access token timestamp string yes 当前

  • 我正在为Azure服务总线使用最新的Java绑定(V3.1.3):https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/servicebus 当我创建一个新的队列客户端,计划一条消息,然后取消它... ...代码似乎按预期工作:活动消息计数变为0。但是一旦被调度的消息到达它应该被调度的时间(我测试了10秒和100秒以后),消息有时会

  • 问题内容: 我可以在控制器中看到该事件,但看不到如何告诉Angular留下。我需要弹出类似“您要保存,删除还是取消?”这样的信息。如果用户选择“取消”,则停留在当前“页面”上。我看不到任何允许侦听器取消路由更改的事件。 问题答案: 您正在听错事件,我做了一些谷歌搜索,但在文档中找不到任何内容。快速测试: 在全局控制器中,阻止了位置更改。

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下: