private bool Receive(IList <RedisRequest> requests, RedisSocketContext context) { if (requests != null) { var requestCount = requests.Count; if (requestCount > 0) { var socket = context.Socket; if (socket.IsConnected()) { using (var reader = new RedisSingleResponseReader(context.Settings)) { for (var i = 0; i < requestCount; i++) { try { var request = requests[i]; if (ReferenceEquals(request, null)) { continue; } var execResult = reader.Execute(socket); if (ReferenceEquals(execResult, null)) { throw new RedisFatalException("Corrupted redis response data", RedisErrorCode.CorruptResponse); } execResult.HandleError(); var rawObj = RedisRawObject.ToObject(execResult); if (ReferenceEquals(rawObj, null)) { throw new RedisFatalException("Corrupted redis response data", RedisErrorCode.CorruptResponse); } request.ProcessResult(rawObj); } catch (Exception e) { SetException(requests, e, i); throw; } } } return(true); } } } return(false); }
public RedisRaw ExpectArray(RedisSocketContext context, bool throwException = true) { using (var response = ExecuteInternal(context, throwException)) { if (response == null) { if (throwException) { throw new RedisException("No data returned", RedisErrorCode.CorruptResponse); } return(null); } return(new RedisRaw(RedisRawObject.ToObject(response))); } }
private void ProcessReceiveQueue() { var queue = m_ReceiveQ; if (queue == null) { return; } m_ReceiveGate.Reset(); var idleTime = 0; var idleStart = DateTime.MinValue; var request = (RedisAsyncRequest)null; try { using (var reader = new RedisSingleResponseReader(Settings)) { var idleTimeout = IdleTimeout; while (Processing) { if (!queue.TryDequeue(out request)) { if (m_ReceiveGate.Wait(SpinSleepTime)) { m_ReceiveGate.Reset(); } else { idleTime += SpinSleepTime; if (idleTime >= idleTimeout) { break; } } continue; } using (request) { if (idleTime > 0) { var command = request.Command; if (ReferenceEquals(command, null) || !command.IsHeartBeat) { idleTime = 0; } } try { var context = m_CurrentContext; if (context == null) { continue; } if (!request.IsCompleted) { var socket = context.Socket; if (socket.IsConnected()) { try { var execResult = reader.Execute(socket); if (ReferenceEquals(execResult, null)) { throw new RedisFatalException("Corrupted redis response data", RedisErrorCode.CorruptResponse); } execResult.HandleError(); var rawObj = RedisRawObject.ToObject(execResult); if (ReferenceEquals(rawObj, null)) { throw new RedisFatalException("Corrupted redis response data", RedisErrorCode.CorruptResponse); } if (!request.ProcessResult(rawObj)) { request.Cancel(); } } catch (Exception e) { request.SetException(e); } } } } catch (Exception) { } } } } } finally { while (queue.TryDequeue(out request)) { try { request.Cancel(); } catch (Exception) { } } } }