diff --git a/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs b/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs index b46baa91..32974bbe 100644 --- a/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs +++ b/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs @@ -446,7 +446,7 @@ private bool TryTakeTask(long delayNanos, out IRunnable task) { const long MaxDelayMilliseconds = int.MaxValue - 1; - if ((ulong)delayNanos > 0UL) // delayNanos >= 0 + if ((ulong)delayNanos > 0UL) // delayNanos 为非负值 { var timeout = PreciseTime.ToMilliseconds(delayNanos); if (_blockingTaskQueue.TryTake(out task, (int)Math.Min(timeout, MaxDelayMilliseconds))) diff --git a/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs b/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs index a85f7e56..b82341d2 100644 --- a/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs +++ b/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs @@ -143,13 +143,16 @@ protected sealed override IRunnable PollTask() Debug.Assert(InEventLoop); - if (_taskQueue.TryDequeue(out IRunnable task)) { return task; } + var taskQueue = _taskQueue; + var task = PollTaskFrom(taskQueue); + if (task is object) { return task; } #if DEBUG if (_tailTasks.IsEmpty) { _emptyEvent.Reset(); } #else _emptyEvent.Reset(); #endif - if (_taskQueue.TryDequeue(out task) || IsShuttingDown) // revisit queue as producer might have put a task in meanwhile + task = PollTaskFrom(taskQueue); + if (task is object || IsShuttingDown) // revisit queue as producer might have put a task in meanwhile { return task; } @@ -158,7 +161,7 @@ protected sealed override IRunnable PollTask() if (ScheduledTaskQueue.TryPeek(out IScheduledRunnable nextScheduledTask)) { var delayNanos = nextScheduledTask.DelayNanos; - if ((ulong)delayNanos > 0UL) // delayNanos >= 0 + if ((ulong)delayNanos > 0UL) // delayNanos 为非负值 { var timeout = PreciseTime.ToMilliseconds(delayNanos); _emptyEvent.Wait((int)Math.Min(timeout, MaxDelayMilliseconds)); @@ -167,7 +170,7 @@ protected sealed override IRunnable PollTask() else { if (!IsShuttingDown) { _emptyEvent.Wait(); } - _ = _taskQueue.TryDequeue(out task); + task = PollTaskFrom(taskQueue); } return task; } diff --git a/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs b/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs index af0d9e83..d4aeea37 100644 --- a/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs +++ b/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs @@ -105,11 +105,7 @@ public void ExecuteAfterEventLoopIteration(IRunnable task) Reject(task); } - if (!(task is ILazyRunnable) -#if DEBUG - && WakesUpForTask(task) -#endif - ) + if (!(task is ILazyRunnable) && WakesUpForTask(task)) { WakeUp(InEventLoop); }