Изглежда, че всички случаи, които са причинявали големи забавяния, могат да бъдат разрешени много по-бързо, като опитате директна връзка чрез сокет като тази:
foreach (string svrName in args)
{
try
{
System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(svrName, 1433);
if (tcp.Connected)
Console.WriteLine("Opened connection to {0}", svrName);
else
Console.WriteLine("{0} not connected", svrName);
tcp.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error connecting to {0}: {1}", svrName, ex.Message);
}
}
Ще използвам този код, за да проверя дали сървърът отговаря на порта на SQL Server и ще се опитам да отворя връзка само ако го направи. Мислех (въз основа на опита на други), че ще има забавяне от 30 секунди дори на това ниво, но веднага получавам съобщение, че машината „активно е отказала връзката“.
Редактиране: И ако машината не съществува, тя също ми казва това веднага. Няма закъснения от 30 секунди, които мога да намеря.
Редактиране: Предполагам, че машини, които са били в мрежата, но не са изключени, продължават да се провалят след 30 секунди. Машините със защитна стена обаче отказват по-бързо.
Редактиране: Ето актуализирания код. Чувствам, че е по-чисто да затворя сокет, отколкото да прекъсна нишка:
static void TestConn(string server)
{
try
{
using (System.Net.Sockets.TcpClient tcpSocket = new System.Net.Sockets.TcpClient())
{
IAsyncResult async = tcpSocket.BeginConnect(server, 1433, ConnectCallback, null);
DateTime startTime = DateTime.Now;
do
{
System.Threading.Thread.Sleep(500);
if (async.IsCompleted) break;
} while (DateTime.Now.Subtract(startTime).TotalSeconds < 5);
if (async.IsCompleted)
{
tcpSocket.EndConnect(async);
Console.WriteLine("Connection succeeded");
}
tcpSocket.Close();
if (!async.IsCompleted)
{
Console.WriteLine("Server did not respond");
return;
}
}
}
catch(System.Net.Sockets.SocketException ex)
{
Console.WriteLine(ex.Message);
}
}