![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var alive = true; 2 string error = null; 3 var success = false; 4 5 // ReSharper disable AccessToModifiedClosure 6 // ReSharper disable UseObjectOrCollectionInitializer 7 var thread = new Thread(() => 8 { 9 try 10 { 11 var connection = new SqlConnection(connectionString); 12 connection.Open(); 13 connection.Close(); 14 15 if (alive) 16 success = true; 17 } 18 catch (SqlException ex) 19 { 20 if (alive) 21 error = ex.Message; 22 } 23 catch (ThreadAbortException) 24 { 25 } 26 finally 27 { 28 if (connection.State == ConnectionState.Open) 29 connection.Close(); 30 } 31 }); 32 // ReSharper restore AccessToModifiedClosure 33 // ReSharper restore UseObjectOrCollectionInitializer 34 thread.IsBackground = true; 35 var sw = Stopwatch.StartNew(); 36 thread.Start(); 37 38 var timeout = TimeSpan.FromSeconds(3); 39 while (sw.Elapsed < timeout) 40 thread.Join(TimeSpan.FromMilliseconds(200)); 41 sw.Stop(); 42 43 if (!success) 44 { 45 alive = false; 46 throw new Exception(error ?? "Connection timeout, please check the connection string."); 47 }