diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Sources/ManualResetValueTaskSourceCore.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Sources/ManualResetValueTaskSourceCore.cs index c29c5e759f2c1d..3ce4906d5b2b70 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Sources/ManualResetValueTaskSourceCore.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Sources/ManualResetValueTaskSourceCore.cs @@ -221,28 +221,30 @@ private void SignalCompletion() if (continuation is not null) { - Debug.Assert(continuation is not null, $"{nameof(continuation)} is null"); - + object? state = _continuationState; + _continuationState = null; object? context = _capturedContext; + _capturedContext = null; + if (context is null) { if (_runContinuationsAsynchronously) { - ThreadPool.UnsafeQueueUserWorkItem(continuation, _continuationState, preferLocal: true); + ThreadPool.UnsafeQueueUserWorkItem(continuation, state, preferLocal: true); } else { - continuation(_continuationState); + continuation(state); } } else if (context is ExecutionContext or CapturedSchedulerAndExecutionContext) { - ManualResetValueTaskSourceCoreShared.InvokeContinuationWithContext(context, continuation, _continuationState, _runContinuationsAsynchronously); + ManualResetValueTaskSourceCoreShared.InvokeContinuationWithContext(context, continuation, state, _runContinuationsAsynchronously); } else { Debug.Assert(context is TaskScheduler or SynchronizationContext, $"context is {context}"); - ManualResetValueTaskSourceCoreShared.ScheduleCapturedContext(context, continuation, _continuationState); + ManualResetValueTaskSourceCoreShared.ScheduleCapturedContext(context, continuation, state); } } } diff --git a/src/libraries/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs b/src/libraries/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs index d509a29359a16f..1b6dab0ee900c7 100644 --- a/src/libraries/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs +++ b/src/libraries/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs @@ -266,11 +266,14 @@ private void SetCompletionAndInvokeContinuation() ctx as ExecutionContext ?? (ctx as CapturedSchedulerAndExecutionContext)?._executionContext; + _capturedContext = null; if (ec is null) { Action c = _continuation!; _continuation = s_completedSentinel; - c(_continuationState); + object? state = _continuationState; + _continuationState = null; + c(state); } else { @@ -279,7 +282,9 @@ ctx as ExecutionContext ?? var thisRef = (AsyncOperation)s!; Action c = thisRef._continuation!; thisRef._continuation = s_completedSentinel; - c(thisRef._continuationState); + object? state = thisRef._continuationState; + thisRef._continuationState = null; + c(state); }, this); } }