public void Discard() { if (_redisSocket == null) { return; } SelfCall("DISCARD"); _commands.Clear(); _redisSocket?.Dispose(); _redisSocket = null; }
public void Dispose() { if (Interlocked.Increment(ref _disposeCounter) != 1) { return; } _redisSocket.Dispose(); }
public void Dispose() { _io.Dispose(); if (_redisSocket != null) { _redisSocket.Dispose(); } }
public void Dispose() { if (_asyncConnector.IsValueCreated) { _asyncConnector.Value.Dispose(); } _io.Dispose(); _redisSocket?.Dispose(); }
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()); } }
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); } }
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; }
public override void Dispose() { _redisSocket.Dispose(); }
public void Dispose() { _redisSocket.Dispose(); }
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))); }