From a73403d9e09857dfdd13c041a51bb02a0cc175bb Mon Sep 17 00:00:00 2001 From: Oleksandr Poliakov Date: Tue, 14 Oct 2025 17:58:53 -0700 Subject: [PATCH 1/3] CSHARP-5725: C# driver stopped working with Unity since v3.2.0 --- .../Core/Connections/TcpStreamFactory.cs | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs index be13ca03d17..199b14ca689 100644 --- a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs +++ b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs @@ -203,31 +203,40 @@ private void Connect(Socket socket, EndPoint endPoint, CancellationToken cancell private async Task ConnectAsync(Socket socket, EndPoint endPoint, CancellationToken cancellationToken) { - var timeoutTask = Task.Delay(_settings.ConnectTimeout, cancellationToken); - var connectTask = socket.ConnectAsync(endPoint); + Task connectTask; - await Task.WhenAny(connectTask, timeoutTask).ConfigureAwait(false); - - if (!connectTask.IsCompleted) +#if !NET472 + connectTask = socket.ConnectAsync(endPoint); +#else + var dnsEndPoint = endPoint as DnsEndPoint; + if (dnsEndPoint != null) { - try - { - socket.Dispose(); - // should await on the read task to avoid UnobservedTaskException - await connectTask.ConfigureAwait(false); - } catch { } - - cancellationToken.ThrowIfCancellationRequested(); - throw new TimeoutException($"Timed out connecting to {endPoint}. Timeout was {_settings.ConnectTimeout}."); + // mono doesn't support DnsEndPoint in its BeginConnect method. + connectTask = Task.Factory.FromAsync(socket.BeginConnect(dnsEndPoint.Host, dnsEndPoint.Port, null, null), socket.EndConnect); } - + else + { + connectTask = Task.Factory.FromAsync(socket.BeginConnect(endPoint, null, null), socket.EndConnect); + } +#endif try { - await connectTask.ConfigureAwait(false); + await connectTask.WaitAsync(_settings.ConnectTimeout, cancellationToken).ConfigureAwait(false); } - catch + catch (Exception ex) { - try { socket.Dispose(); } catch { } + try + { + socket.Dispose(); + connectTask.IgnoreExceptions(); + } + catch { } + + if (ex is TimeoutException) + { + throw new TimeoutException($"Timed out connecting to {endPoint}. Timeout was {_settings.ConnectTimeout}."); + } + throw; } } From 2d06367062f64615aa2607ad68556dc6aea7ae36 Mon Sep 17 00:00:00 2001 From: Oleksandr Poliakov Date: Wed, 22 Oct 2025 10:44:58 -0700 Subject: [PATCH 2/3] pr --- src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs index 199b14ca689..ef1600c8cb5 100644 --- a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs +++ b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs @@ -208,8 +208,7 @@ private async Task ConnectAsync(Socket socket, EndPoint endPoint, CancellationTo #if !NET472 connectTask = socket.ConnectAsync(endPoint); #else - var dnsEndPoint = endPoint as DnsEndPoint; - if (dnsEndPoint != null) + if (endPoint is DnsEndPoint dnsEndPoint) { // mono doesn't support DnsEndPoint in its BeginConnect method. connectTask = Task.Factory.FromAsync(socket.BeginConnect(dnsEndPoint.Host, dnsEndPoint.Port, null, null), socket.EndConnect); From 984a899e1c3db1833e5e70958042ae35a2fb34d3 Mon Sep 17 00:00:00 2001 From: Oleksandr Poliakov Date: Wed, 22 Oct 2025 12:02:37 -0700 Subject: [PATCH 3/3] pr --- .../Core/Connections/TcpStreamFactory.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs index ef1600c8cb5..db1e71df9ca 100644 --- a/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs +++ b/src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs @@ -166,7 +166,7 @@ private void ConfigureConnectedSocket(Socket socket) private void Connect(Socket socket, EndPoint endPoint, CancellationToken cancellationToken) { IAsyncResult connectOperation; - +#if NET472 if (endPoint is DnsEndPoint dnsEndPoint) { // mono doesn't support DnsEndPoint in its BeginConnect method. @@ -176,6 +176,9 @@ private void Connect(Socket socket, EndPoint endPoint, CancellationToken cancell { connectOperation = socket.BeginConnect(endPoint, null, null); } +#else + connectOperation = socket.BeginConnect(endPoint, null, null); +#endif WaitHandle.WaitAny([connectOperation.AsyncWaitHandle, cancellationToken.WaitHandle], _settings.ConnectTimeout); @@ -204,19 +207,18 @@ private void Connect(Socket socket, EndPoint endPoint, CancellationToken cancell private async Task ConnectAsync(Socket socket, EndPoint endPoint, CancellationToken cancellationToken) { Task connectTask; - -#if !NET472 - connectTask = socket.ConnectAsync(endPoint); -#else +#if NET472 if (endPoint is DnsEndPoint dnsEndPoint) { - // mono doesn't support DnsEndPoint in its BeginConnect method. - connectTask = Task.Factory.FromAsync(socket.BeginConnect(dnsEndPoint.Host, dnsEndPoint.Port, null, null), socket.EndConnect); + // mono doesn't support DnsEndPoint in its ConnectAsync method. + connectTask = socket.ConnectAsync(dnsEndPoint.Host, dnsEndPoint.Port); } else { - connectTask = Task.Factory.FromAsync(socket.BeginConnect(endPoint, null, null), socket.EndConnect); + connectTask = socket.ConnectAsync(endPoint); } +#else + connectTask = socket.ConnectAsync(endPoint); #endif try {