diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs index b9c18134346b01..ff944b29597c5b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs @@ -373,7 +373,10 @@ private void QueueWaitCompletion(RegisteredWaitHandle registeredHandle, bool tim // If the handle is a repeating handle, set up the next call. Otherwise, remove it from the wait thread. if (registeredHandle.Repeating) { - registeredHandle.RestartTimeout(); + if (!registeredHandle.IsInfiniteTimeout) + { + registeredHandle.RestartTimeout(); + } } else { diff --git a/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs b/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs index f985c1a7a521d6..0e3534c38704d4 100644 --- a/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs +++ b/src/libraries/System.Threading.ThreadPool/tests/RegisteredWaitTests.cs @@ -126,6 +126,24 @@ public static void QueueRegisterPositiveAndFlowTest() false); waitForBackgroundWork(true); Assert.Equal(0, backgroundAsyncLocalValue); + + // Validate a repeating waithandle with infinite timeout. + registeredWaitHandle = + ThreadPool.UnsafeRegisterWaitForSingleObject( + registerWaitEvent, + (state, timedOut) => + { + commonBackgroundTest(true, () => + { + Assert.Same(obj, state); + Assert.False(timedOut); + }); + }, + obj, + -1, // Infinite + false); // Execute once + waitForBackgroundWork(true); + Assert.Equal(0, backgroundAsyncLocalValue); } [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))]