Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IRedisSubscription连接_C#_Redis_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Redis,servicestack" /> servicestack,C#,Redis,servicestack" />

C# IRedisSubscription连接

C# IRedisSubscription连接,c#,redis,servicestack,C#,Redis,servicestack,我正在使用服务堆栈连接到Redis并使用子包功能 我是否应该保持IRedisSubscription和IRedisClient实例化处于活动状态?例如,我应该将其分配给类级别变量吗 或者我可以简单地在using语句中定义它的范围,服务堆栈将处理持久性 也就是说,以下哪个示例是正确的: 公共类RedisPubSub1:IDisposable{ private static PooledRedisClientManager ClientPool = new PooledRedisClient

我正在使用服务堆栈连接到Redis并使用子包功能

我是否应该保持IRedisSubscription和IRedisClient实例化处于活动状态?例如,我应该将其分配给类级别变量吗

或者我可以简单地在using语句中定义它的范围,服务堆栈将处理持久性

也就是说,以下哪个示例是正确的:

公共类RedisPubSub1:IDisposable{

    private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString");
    private IRedisSubscription _subscription;
    private IRedisClient _client;

    private Action<string, string> _publish;
    public event Action<string, string> Publish {
        add { _publish += value; }
        remove { _publish -= value; }
    }

    public RedisPubSub1()
    {         
        Task.Factory.StartNew(() =>
            {
                _client = ClientPool.GetClient();
                _subscription = _client.CreateSubscription();
                    {
                        _subscription.OnMessage = EnqueEvent;
                        _subscription.SubscribeToChannels(new string[] { Channel });
                    }
        });
    }

    private void EnqueEvent(string channel, string message)
    {
        if (_publish!= null)
            _publish(channel, message);
    }      

    public void Dispose()
    {
        _subscription.Dispose();
        _client.Dispose();


    }
} }
private static PooledRedisClientManager客户端池=新的PooledRedisClientManager(“connectionString”);
私人IRedisSubscription(认购);;
私人iRediclient\u客户;
私人行动——出版;
公共活动行动发布{
添加{u publish+=value;}
删除{u publish-=value;}
}
公共图书馆1()
{         
Task.Factory.StartNew(()=>
{
_client=ClientPool.GetClient();
_订阅=_client.CreateSubscription();
{
_subscription.OnMessage=EnqueEvent;
_subscription.SubscribeToChannels(新字符串[]{Channel});
}
});
}
私有void EnqueEvent(字符串通道、字符串消息)
{
如果(_publish!=null)
_发布(频道、消息);
}      
公共空间处置()
{
_subscription.Dispose();
_client.Dispose();
}
} }

公共类重新发布子2{

    private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString");

    private Action<string, string> _publish;

    public event Action<string, string> Publish {
        add { _publish += value; }
        remove { _publish -= value; }
    }

    public RedisPubSub2()
    {         
        Task.Factory.StartNew(() =>
            {
                using(var _client = ClientPool.GetClient())
                {
                    using(_subscription = _client.CreateSubscription()
                    {
                        _subscription.OnMessage = EnqueEvent;
                        _subscription.SubscribeToChannels(new string[] { Channel });
                    }
                }
        });
    }

    private void EnqueEvent(string channel, string message)
    {
        if (_publish!= null)
            _publish(channel, message);
    }       }
private static PooledRedisClientManager客户端池=新的PooledRedisClientManager(“connectionString”);
私人行动——出版;
公共活动行动发布{
添加{u publish+=value;}
删除{u publish-=value;}
}
公共图书馆2(
{         
Task.Factory.StartNew(()=>
{
使用(var\u client=ClientPool.GetClient())
{
使用(_subscription=_client.CreateSubscription()
{
_subscription.OnMessage=EnqueEvent;
_subscription.SubscribeToChannels(新字符串[]{Channel});
}
}
});
}
私有void EnqueEvent(字符串通道、字符串消息)
{
如果(_publish!=null)
_发布(频道、消息);
}       }

SubscribeToChannels处于阻塞状态,因此您是否保留对连接的引用并不重要,因为除非您结束订阅(即取消订阅),否则它不会处理

建议您在需要时实现某种方式来取消订阅,这是您希望对持有活动订阅的线程执行的操作,如中所示,例如:


谢谢!我想知道为什么那个呼叫被阻止了,现在有道理了。嗨,我有个问题,如果redis服务器重新启动,它会停止阻止并继续吗?我们注意到订阅在redis服务器重新启动后停止接收消息。我最初的计划是循环订阅,以便订阅方可以恢复丢失的连接动作。@代码语言学家此API映射到Redis Pub/Sub命令附近,上面的示例不包括任何失败的Redis服务器实例的自动恢复逻辑。您可以用于在连接失败时自动重新连接的托管订阅。
using (var subscription = redisClient.CreateSubscription())
{
    subscription.OnUnSubscribe = channel => 
       Log.Debug("OnUnSubscribe: " + channel);

    subscription.OnMessage = (channel, msg) =>
    {
        if (msg == "STOP")
        {
            Log.Debug("UnSubscribe From All Channels...");
            subscription.UnSubscribeFromAllChannels(); //Un block thread.
            return;
        }

        handleMessage(msg);
    }   

    ...

    //Unsubscribing will unblock this subscription:
    subscription.SubscribeToChannels(QueueNames.TopicIn); //blocks thread
}