Güncelleştirme 2 Kendi zaman aşımınızı yuvarlamanızı öneririm. Böyle bir şey:
internal static class Program
{
private static void Main(string[] args)
{
Console.WriteLine(SqlServerIsRunning("Server=foobar; Database=tempdb; Integrated Security=true", 5));
Console.WriteLine(SqlServerIsRunning("Server=localhost; Database=tempdb; Integrated Security=true", 5));
}
private static bool SqlServerIsRunning(string baseConnectionString, int timeoutInSeconds)
{
bool result;
using (SqlConnection sqlConnection = new SqlConnection(baseConnectionString + ";Connection Timeout=" + timeoutInSeconds))
{
Thread thread = new Thread(TryOpen);
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
thread.Start(new Tuple<SqlConnection, ManualResetEvent>(sqlConnection, manualResetEvent));
result = manualResetEvent.WaitOne(timeoutInSeconds*1000);
if (!result)
{
thread.Abort();
}
sqlConnection.Close();
}
return result;
}
private static void TryOpen(object input)
{
Tuple<SqlConnection, ManualResetEvent> parameters = (Tuple<SqlConnection, ManualResetEvent>)input;
try
{
parameters.Item1.Open();
parameters.Item1.Close();
parameters.Item2.Set();
}
catch
{
// Eat any exception, we're not interested in it
}
}
}
Güncelleme 1
Sadece bu kodu kullanarak kendi bilgisayarda bu test ettik:
internal static class Program
{
private static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server=localhost; Database=tempdb; Integrated Security=true;Connection Timeout=5");
Console.WriteLine("Attempting to open connection with {0} second timeout, starting at {1}.", con.ConnectionTimeout, DateTime.Now.ToLongTimeString());
try
{
con.Open();
Console.WriteLine("Successfully opened connection at {0}.", DateTime.Now.ToLongTimeString());
}
catch (SqlException)
{
Console.WriteLine("SqlException raised at {0}.", DateTime.Now.ToLongTimeString());
}
}
}
ve bağlantı dizesinde Connection Timeout
değerini itaat . Bu, SQL Server 2008 R2'ye karşı .NET 4 ile yapıldı. Kuşkusuz, farklı sonuçlar verebilen bir localhost bağlantısıdır, ancak sorunu kopyalayamamam anlamına gelir.
Ağ ortamınızda benzer bir kod örneğini denemenizi ve uzun zaman aşımlarını görmeye devam edip etmediğinizi görmenizi öneririz.
Eski (yanlış) cevap ben yanlış ConnectionTimeout
mülkiyet ayarlanabilir olduğunu düşündüm, ama öyle değil.
Bağlantı dizesini kullanmak yerine SqlConnection.ConnectionTimeout ayarlamayı deneyin.
ConnectionTimeout burada çok garip bir desen vuruyorum salt okunur bir özellik – BlueMonkMN
: a parçacığı iptal olmadığı kadar bir yuva kapatmak için daha temiz gibi hissediyorum. Yerel sistemime SQL Server durduğunda bağlandığımda zaman aşımı çalışıyor gibi görünüyor. Varolmayan bir sunucuya bağlanmaya çalıştığımda çalışıyor gibi görünüyor. Ancak var olan bir sunucuya bağlanmaya çalıştığımda işe yaramaz, ancak güvenlik duvarını SQL'i engelliyor ve/veya SQL Server kurulu değil. – BlueMonkMN
Buradaki ilginç bir konu: http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic48533.aspx. Kendi zaman aşımı mekanizmasını uygulamanızı öneririm - açık yapmayı denemek ve istediğiniz zaman aşımı süresinde başarılı olmazsa öldürmek için bir iş parçacığı döndürün. –