internal T EnqueueSync <T>(RedisCommand <T> command) { var qs = Interlocked.Increment(ref _asyncqs); var cmd = new PipelineCommandToken <T>(false, command); _cmdqs.Enqueue(cmd); if (MergeSize > 1 && qs >= MergeSize) { FlushAndSend(); if (cmd.SyncException != null) { throw cmd.SyncException; } return(cmd.SyncReturnValue); } if (qs == 1) { if (cmd.SyncWait.Wait(TimeWait)) { if (cmd.SyncException != null) { throw cmd.SyncException; } return(cmd.SyncReturnValue); } FlushAndSend(); if (cmd.SyncException != null) { throw cmd.SyncException; } return(cmd.SyncReturnValue); } T obj; try { if (cmd.SyncWait.Wait(TimeSpan.FromSeconds(10))) { obj = cmd.SyncReturnValue; } else { cmd.SyncIsTimeout = true; cmd.SyncException = new TimeoutException($"AutoPipeline 同步执行超时({command.Command + string.Join(" ", command.Arguments)})。"); } } catch { } if (cmd.SyncException != null) { throw cmd.SyncException; } return(cmd.SyncReturnValue); }
async internal Task <T> EnqueueAsync <T>(RedisCommand <T> command) { var qs = Interlocked.Increment(ref _asyncqs); var cmd = new PipelineCommandToken <T>(true, command); _cmdqs.Enqueue(cmd); if (MergeSize > 1 && qs >= MergeSize) { FlushAndSend(); return(await cmd.TaskSource.Task); } if (qs == 1) { await TaskEx.Delay(TimeWait); FlushAndSend(); return(await cmd.TaskSource.Task); } return(await cmd.TaskSource.Task); }