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(); } } }
または
パブリック クラス 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); } }