2011-02-05 49 views
1

我想實現我的數據庫查詢超時...所以如果一個操作運行太久我需要取消查詢並返回一個超時消息到一個asp.net頁面... 。線程在asp.net

繼承人我使用的超時部分的代碼....問題就是我有時從查詢得到的部分結果集...

RunSearch search = new RunSearch(GetSearchResults); 
Thread searchThread = new Thread(delegate() { 
dsRes = search.Invoke(ProcessingID, 
objSqlConnection,SearchStartTime); }); 

searchThread.Start(); 
// searchThread.Join(ResultPollingPeriod * 1000); 

if (!searchThread.Join(ResultPollingPeriod * 1000)) 
{ 
    searchThread.Abort(); 
    dsRes = null; 
    return ReturnTimeoutMessage(); 
} 
else 
{ 
    return dsRes; 
} 

任何幫助深表感謝......

回答

1

根據你的目標,有幾種方法可以解決這個問題,但你不應該寫你的o執行此操作。你可以設置數據庫本身的超時時間,所以你不必在代碼中處理這個。如果你想讓它成爲客戶端定義,儘管這裏有兩種類型的超時需要考慮:連接超時和命令超時。

連接超時是無法連接到服務器的時間。這是通過添加Connect Timeout=30在連接字符串設置中設置的。如果它在30秒內未建立連接,則會超時。

如果沒有建立連接,那麼你需要SqlCommand對象的命令超時:

using (SqlCommand myCommand = new SqlCommand()) 
{ 
    myCommand.CommandTimeout = 30; 
    //the rest of your command setup here 
} 

這是我的理解是,將CommandTimeout與連接超時同時運行 - 所以如果用29秒時間來連接該命令必須在1秒內執行並返回。

這些超時會引發異常,然後您可以根據需要捕捉並執行異常(向ASP.NET頁面或其他位置返回超時消息)。