我正在使用 Service Stack 连接到 Redis 并使用 SubPub 功能。
我应该保持 IRedisSubscription 和 IRedisClient 实例化处于事件状态吗?例如,我应该将其分配给类级别变量吗?
或者我可以简单地将其范围限制在 using 语句中,并且服务堆栈将处理持久性吗?
也就是说,以下哪个示例是正确的:
public class 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(); } } }
或者
public class RedisPubSub2 {
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); } }
最佳答案
SubscribeToChannels 处于阻塞状态,因此您是否保留对连接的引用并不重要,因为除非您结束订阅(即取消订阅),否则它不会释放。
建议您在需要时实现某种方法来取消订阅,您希望对持有事件订阅的线程执行此操作,如 RedisMqServer example 中所示。 ,例如:
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
}
关于c# - IRedis订阅连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280022/