コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }