diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TestProgressStateAwareTerminal.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TestProgressStateAwareTerminal.cs index f74d66a06d..4167806c4c 100644 --- a/src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TestProgressStateAwareTerminal.cs +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TestProgressStateAwareTerminal.cs @@ -47,9 +47,12 @@ private void ThreadProc() const int AnsiUpdateCadenceInMs = 500; while (!_cts.Token.WaitHandle.WaitOne(AnsiUpdateCadenceInMs)) { + // Note: OnProgressStartUpdate is invoked outside the lock to avoid a deadlock where + // a test subscriber blocks the event handler (e.g. with WaitOne) while the lock is held, + // preventing other callers (e.g. WriteToTerminal) from acquiring the lock. + OnProgressStartUpdate?.Invoke(this, EventArgs.Empty); lock (_lock) { - OnProgressStartUpdate?.Invoke(this, EventArgs.Empty); _terminal.StartUpdate(); try {