2016-01-18 106 views
3

當連接到SQL-Server時,我的程序執行掛起.Open()方法超過指定的2秒超時。IDbConnection打開掛起C#

當數據庫處於打開狀態的機器處於脫機狀態或重新啓動時,我設法重現該問題。當數據庫處於打開狀態的機器啓動時,程序的執行不會掛起。

如何強制拋出異常或2秒超時超時?

我試過OleDB和SqlConnection提供者,沒有什麼區別。

我可以ping本機連接到它之前,但仍有區分,平安一定會成功(假設機器關機前1秒),然後打開連接掛...下面提供

示例代碼。

public static IDbConnection GetConnection(IDbConnection connection) 
{ 
    connection.ConnectionString = "connectionString; Connection Timeout=2;"; 
    connection.Open(); 
    return connection; 
} 
+2

連接超時屬性只是創建連接的時間,之後的所有事情(連接建立後還有很多事情)不會_count_並且可能無限期地(除非有_another_ timeout我是不知道)。你可以做的是在帶有_watchdog_的單獨線程中執行你自己的代碼,以將總時間執行限制爲2秒(注意對於TCP連接,2秒是非常短的時間)。 –

回答

2

Connection Timeout財產僅僅是要創建的連接的時間,其後的內容(並有大量的工作要做連接建立後)不計數,它可以無限地採取(除非有另一個超時我不知道)。

你可以做的是在一個單獨的線程中用一個看門狗執行你自己的代碼,以限制總時間執行到兩秒。使用任務這是很容易的:

const int HardConnectionTimeoutInMilliseconds = 2000; 
if (!Task.Run(() => connection.Open()).Wait(HardConnectionTimeoutInMilliseconds)) 
    return null; // Timeout! 

只是爲了完整性,這是該舊式代碼

Thread worker = new Thread(delegate() 
{ 
    connection.Open(); 
}); 
worker.Start(); 

if (!worker.Join(TimeSpan.FromSeconds(2))) 
    return null; 

小心這麼短超時:TCP連接2秒總是時間太短,如果您使用AD身份驗證,則可能需要比您期望的更長的時間。

在我看來,你必須與此滯後(15至30秒是安全和合理的TCP連接與集成安全性)。您可能還想等待更多並重試(因爲錯誤可能是暫時的,請參閱Know when to retry or fail when calling SQL Server from C#?),請注意,您所描述的情況(服務器爲正在關閉)非常不尋常,那麼IMO不應影響正常操作。如果這是你的UI的問題,那麼你應該讓你的程序平行(以保持UI響應)。