Пример #1
0
 public void Discard()
 {
     if (_redisSocket == null)
     {
         return;
     }
     SelfCall("DISCARD");
     _commands.Clear();
     _redisSocket?.Dispose();
     _redisSocket = null;
 }
Пример #2
0
 public void Dispose()
 {
     if (Interlocked.Increment(ref _disposeCounter) != 1)
     {
         return;
     }
     _redisSocket.Dispose();
 }
Пример #3
0
        public void Dispose()
        {
            _io.Dispose();

            if (_redisSocket != null)
            {
                _redisSocket.Dispose();
            }
        }
        public void Dispose()
        {
            if (_asyncConnector.IsValueCreated)
            {
                _asyncConnector.Value.Dispose();
            }

            _io.Dispose();
            _redisSocket?.Dispose();
        }
Пример #5
0
            static void EndPipe(IRedisSocket rds, IEnumerable <PipelineCommand> cmds)
            {
                var err = new List <PipelineCommand>();
                var ms  = new MemoryStream();

                try
                {
                    var respWriter = new RespHelper.Resp3Writer(ms, rds.Encoding, rds.Protocol);
                    foreach (var cmd in cmds)
                    {
                        respWriter.WriteCommand(cmd.Command);
                    }

                    if (rds.IsConnected == false)
                    {
                        rds.Connect();
                    }
                    ms.Position = 0;
                    ms.CopyTo(rds.Stream);

                    foreach (var pc in cmds)
                    {
                        pc.Command._redisSocket = rds;
                        pc.Result = pc.Parse(pc);
                        if (pc.Command.ReadResult.IsError)
                        {
                            err.Add(pc);
                        }
                    }
                }
                finally
                {
                    ms.Close();
                    ms.Dispose();
                    rds?.Dispose();
                }

                if (err.Any())
                {
                    var sb = new StringBuilder();
                    for (var a = 0; a < err.Count; a++)
                    {
                        var cmd = err[a].Command;
                        if (a > 0)
                        {
                            sb.Append("\r\n");
                        }
                        sb.Append(cmd.ReadResult.SimpleError).Append(" {").Append(cmd.ToString()).Append("}");
                    }
                    throw new RedisException(sb.ToString());
                }
            }
Пример #6
0
        public void Dispose()
        {
            if (_asyncConnector.IsValueCreated)
            {
                _asyncConnector.Value.Dispose();
            }

            _io.Dispose();

            if (_redisSocket != null)
            {
                _redisSocket.Dispose();
            }
        }
 public void Dispose()
 {
     if (Interlocked.Increment(ref _disposeCounter) != 1)
     {
         return;
     }
     try
     {
         _redisSocket.Dispose();
     }
     finally
     {
         GC.SuppressFinalize(this);
     }
 }
Пример #8
0
            void TryReset()
            {
                if (_redisSocket == null)
                {
                    return;
                }
#if isasync
                for (var a = 0; a < _commands.Count; a++)
                {
                    _commands[a].TrySetCanceled();
                }
#endif
                _commands.Clear();
                _redisSocket?.Dispose();
                _redisSocket = null;
            }
Пример #9
0
 public override void Dispose()
 {
     _redisSocket.Dispose();
 }
Пример #10
0
 public void Dispose()
 {
     _redisSocket.Dispose();
 }
Пример #11
0
            internal IDisposable Subscribe(bool psub, string[] channels, Action <string, string, object> handler)
            {
                if (_stoped)
                {
                    return(new PubSubSubscribeDisposable(this, null));
                }
                channels = channels?.Distinct().Where(a => !string.IsNullOrEmpty(a)).ToArray(); //In case of external modification
                if (channels?.Any() != true)
                {
                    return(new PubSubSubscribeDisposable(this, null));
                }

                var id      = Guid.NewGuid();
                var time    = DateTime.Now;
                var regkeys = channels.Select(a => psub ? $"{_psub_regkey_prefix}{a}" : a).ToArray();

                for (var a = 0; a < regkeys.Length; a++)
                {
                    ConcurrentDictionary <Guid, RegisterInfo> dict = null;
                    lock (_lock) dict = _registers.GetOrAdd(regkeys[a], k1 => new ConcurrentDictionary <Guid, RegisterInfo>());
                    dict.TryAdd(id, new RegisterInfo(id, handler, time));
                }
                lock (_lock)
                    _cancels.TryAdd(id, regkeys);
                var isnew = false;

                if (IsSubscribed == false)
                {
                    lock (_lock)
                    {
                        if (IsSubscribed == false)
                        {
                            _redisSocket = _topOwner.Adapter.GetRedisSocket(null);
                            IsSubscribed = isnew = true;
                        }
                    }
                }
                if (isnew)
                {
                    new Thread(() =>
                    {
                        _redisSocketReceiveTimeoutOld = _redisSocket.ReceiveTimeout;
                        _redisSocket.ReceiveTimeout   = TimeSpan.Zero;
                        var timer = new Timer(state =>
                        {
                            _topOwner.Adapter.Refersh(_redisSocket); //防止 IdleBus 超时回收
                            try { _redisSocket.Write("PING"); } catch { }
                        }, null, 10000, 10000);
                        var readCmd = "PubSubRead".SubCommand(null).FlagReadbytes(false);
                        while (_stoped == false)
                        {
                            RedisResult rt = null;
                            try
                            {
                                rt = _redisSocket.Read(readCmd);
                            }
                            catch
                            {
                                Thread.CurrentThread.Join(100);
                                if (_cancels.Any())
                                {
                                    continue;
                                }
                                break;
                            }
                            var val = rt.Value as object[];
                            if (val == null)
                            {
                                continue;              //special case
                            }
                            var val1 = val[0].ConvertTo <string>();
                            switch (val1)
                            {
                            case "pong":
                            case "punsubscribe":
                            case "unsubscribe":
                                continue;

                            case "pmessage":
                                OnData(val[1].ConvertTo <string>(), val[2].ConvertTo <string>(), val[3]);
                                continue;

                            case "message":
                                OnData(null, val[1].ConvertTo <string>(), val[2]);
                                continue;
                            }
                        }
                        timer.Dispose();
                        lock (_lock)
                        {
                            IsSubscribed = false;
                            _redisSocket.ReceiveTimeout = _redisSocketReceiveTimeoutOld;
                            _redisSocket.ReleaseSocket();
                            _redisSocket.Dispose();
                            _redisSocket = null;
                        }
                    }).Start();
                }
                Call((psub ? "PSUBSCRIBE" : "SUBSCRIBE").Input(channels));
                return(new PubSubSubscribeDisposable(this, () => Cancel(id)));
            }