diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs index cd269e5916..e877f27ca2 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs @@ -198,17 +198,8 @@ private static Socket Connect(string serverName, int port, TimeSpan timeout, boo ipAddresses = new IPAddress[] { serverIPv4, serverIPv6 }; Socket[] sockets = new Socket[2]; - CancellationTokenSource cts = new CancellationTokenSource(); + CancellationTokenSource cts = null; - if (isInfiniteTimeout) - { - cts.CancelAfter(-1); - } - else - { - cts.CancelAfter(timeout); - } - void Cancel() { for (int i = 0; i < sockets.Length; ++i) @@ -224,33 +215,45 @@ void Cancel() catch { } } } - cts.Token.Register(Cancel); + + if (!isInfiniteTimeout) + { + cts = new CancellationTokenSource(timeout); + cts.Token.Register(Cancel); + } Socket availableSocket = null; - for (int i = 0; i < sockets.Length; ++i) + try { - try + for (int i = 0; i < sockets.Length; ++i) { - if (ipAddresses[i] != null) + try { - sockets[i] = new Socket(ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); - sockets[i].Connect(ipAddresses[i], port); - if (sockets[i] != null) // sockets[i] can be null if cancel callback is executed during connect() + if (ipAddresses[i] != null) { - if (sockets[i].Connected) - { - availableSocket = sockets[i]; - break; - } - else + sockets[i] = new Socket(ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); + sockets[i].Connect(ipAddresses[i], port); + if (sockets[i] != null) // sockets[i] can be null if cancel callback is executed during connect() { - sockets[i].Dispose(); - sockets[i] = null; + if (sockets[i].Connected) + { + availableSocket = sockets[i]; + break; + } + else + { + sockets[i].Dispose(); + sockets[i] = null; + } } } } + catch { } } - catch { } + } + finally + { + cts?.Dispose(); } return availableSocket;