diff --git a/src/Shared/Process/ProcessEx.cs b/src/Shared/Process/ProcessEx.cs index c4f0002d5c..ad7d06b1ed 100644 --- a/src/Shared/Process/ProcessEx.cs +++ b/src/Shared/Process/ProcessEx.cs @@ -49,10 +49,15 @@ namespace Microsoft.AspNetCore.Internal _exited = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + // We greedily create a timeout exception message even though a timeout is unlikely to happen for two reasons: + // 1. To make it less likely for Process getters to throw exceptions like "System.InvalidOperationException: Process has exited, ..." + // 2. To ensure if/when exceptions are thrown from Process getters, these exceptions can easily be observed. + var timeoutExMessage = $"Process proc {proc.ProcessName} {proc.StartInfo.Arguments} timed out after {DefaultProcessTimeout}."; + _processTimeoutCts = new CancellationTokenSource(timeout); _processTimeoutCts.Token.Register(() => { - _exited.TrySetException(new TimeoutException($"Process proc {proc.ProcessName} {proc.StartInfo.Arguments} timed out after {DefaultProcessTimeout}.")); + _exited.TrySetException(new TimeoutException(timeoutExMessage)); }); }