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);
}
///