2017-03-06 150 views
0

我有一組異步方法用於處理大量的數據庫並以高速方式編譯並編譯。大多數情況下,這些工作都非常棒,併爲我的軟件創造了奇蹟。但是,最近我遇到了一個小問題:用戶偶爾會發現一些問題,並且在獲取信息之前,軟件拉動數據的時間間隔變得巨大,數據適配器超時。通常,在同步方法中,您可以使用try/catch來處理這些問題,但我試過這種方法無濟於事。有沒有辦法異步處理異常,只是拋出一個同步方法,所以我趕上所有的try/catch可以正常工作?DataAdapter填充異步異常

這是數據適配器異步方法我用一個例子:

private async Task<DataTable> WWQuery2Run 
(string A, string B, string C, string D) 
{ 
    using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
    { 
    var temp = new DataTable(); 
    var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 
    await Task.Run(() => DA.Fill(temp)); 
    return temp; 
    } 
} 

編輯

之後我試圖從超時,這是處理異常的一切煩惱實現這不是一種好的做法。我繼續添加一個方法來計算持續時間,然後再進入顯示的異步方法,並警告用戶長度並給他們一箇中止編譯的選項。有了這個,我將查詢的超時時間增加到了一個數量,該數額應該覆蓋除了最壞的情況之外的所有情況,以便用戶希望繼續。我還在程序中的項目上添加了計算持續時間的說明,以便他們知道在嘗試查詢和編譯之前它已經很久了。

謝謝@穆拉德加里扎達爲您的協助。

回答

0

您可以增加適配器命令超時象下面這樣:

SqlDataAdapter adapter= new SqlDataAdapter(strSQLString, conUS); 
adapter.SelectCommand.CommandTimeout=120; 

處理異常:

private async Task<DataTable> WWQuery2Run 
    (string A, string B, string C, string D) 
    { 
     using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
{ 
var temp = new DataTable(); 
var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 


Task task = new Task(() => DA.Fill(temp)); 
try 
{ 
    task.Wait(); 
} 
catch (Exception ae) 
{ 



} 

return temp; 
} 
} 
+0

這是有效的,但是,我寧願它超時,然後提醒用戶有可能的問題。我得到的是,我可能要求一些不正確的東西,但我的用戶有點朦朧,並且會認爲軟件有問題,而不是在時間過度的情況下出現操作員錯誤。 – ARidder101

+0

這是非常簡單的,請轉到鏈接:https://msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx – Murad

+0

您可以舉一個例子,說明該鏈接中的方法將工作?我曾多次嘗試使該方法有效,但對我來說,該鏈接中的方法似乎不適用於異步方法/任務,因此對我的問題沒有任何幫助。 – ARidder101

0

隨着增加命令超時,你可以使用try/catch塊。由於您正在等待,因此只有在WWQuery2Run完成後,控制纔會返回到您的呼叫代碼。如果WWQuery2Run拋出SomeException,它將被代碼捕獲和處理。

private async Task<DataTable> WWQuery2Run(string A, string B, string C, string D) 
{ 
    try 
    { 
     using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
     { 
      var temp = new DataTable(); 
      var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 
      await Task.Run(() => DA.Fill(temp)); 
      return temp; 
     } 
    } 
    catch (SomeException ex) 
    { 
     // handle exception 
    } 
}