diff --git a/dotnet/src/webdriver/DriverService.cs b/dotnet/src/webdriver/DriverService.cs index cf4ecfd1d5288..0ed9a16b5dd66 100644 --- a/dotnet/src/webdriver/DriverService.cs +++ b/dotnet/src/webdriver/DriverService.cs @@ -255,14 +255,16 @@ public void Start() DriverProcessStartingEventArgs eventArgs = new DriverProcessStartingEventArgs(this.driverServiceProcess.StartInfo); this.OnDriverProcessStarting(eventArgs); + // Important: Start the process and immediately begin reading the output and error streams to avoid IO deadlocks. this.driverServiceProcess.Start(); + this.driverServiceProcess.BeginOutputReadLine(); + this.driverServiceProcess.BeginErrorReadLine(); + bool serviceAvailable = this.WaitForServiceInitialization(); + DriverProcessStartedEventArgs processStartedEventArgs = new DriverProcessStartedEventArgs(this.driverServiceProcess); this.OnDriverProcessStarted(processStartedEventArgs); - this.driverServiceProcess.BeginOutputReadLine(); - this.driverServiceProcess.BeginErrorReadLine(); - if (!serviceAvailable) { throw new WebDriverException($"Cannot start the driver service on {this.ServiceUrl}"); @@ -286,6 +288,12 @@ protected virtual void Dispose(bool disposing) if (disposing) { this.Stop(); + + if (this.driverServiceProcess is not null) + { + this.driverServiceProcess.OutputDataReceived -= this.OnDriverProcessDataReceived; + this.driverServiceProcess.ErrorDataReceived -= this.OnDriverProcessDataReceived; + } } this.isDisposed = true; diff --git a/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs b/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs index 6825a48a32562..e00c5c5ce3664 100644 --- a/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs +++ b/dotnet/src/webdriver/Firefox/FirefoxDriverService.cs @@ -250,7 +250,6 @@ protected override void OnDriverProcessStarting(DriverProcessStartingEventArgs e /// /// The sender of the event. /// The data received event arguments. - /// A value indicating whether the data received is from the error stream. protected override void OnDriverProcessDataReceived(object sender, DataReceivedEventArgs args) { if (string.IsNullOrEmpty(args.Data)) @@ -279,13 +278,13 @@ protected override void OnDriverProcessDataReceived(object sender, DataReceivedE /// protected override void Dispose(bool disposing) { + base.Dispose(disposing); + if (logWriter != null && disposing) { logWriter.Dispose(); logWriter = null; } - - base.Dispose(disposing); } ///