2012-06-21 46 views
30

我有當一個例外在我的地鐵應用我是否有權忽略編譯器警告,因爲沒有等待這個異步調用?

void Model_ExceptionOccured(Exception ex) 
{ 
    var dlg = new Windows.UI.Popups.MessageDialog("An exception occured during verification: " + ex.Message, "Exception"); 
    dlg.ShowAsync(); 
} 

的「dlg.ShowAsync()」的一部分發生時觸發以下方法 - 調用是異步的,但我不在乎等待結果。該編譯器會生成警告,雖然:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

要在乎?除了擺脫警告之外,是否有任何理由添加await關鍵字?

回答

27

根據以下鏈接,alexm給出的答案是不正確的。在未等待的異步調用期間拋出的異常將會丟失。要擺脫此警告,您應該將異步調用的任務返回值分配給一個變量。這可確保您可以訪問任何拋出的異常,這些異常將在返回值中指示。

http://msdn.microsoft.com/en-us/library/hh965065(v=vs.110).aspx(VB.NET)

http://msdn.microsoft.com/en-us/library/hh873131.aspx(C#)

+0

在VS2012他們改變未觀察到的任務例外的默認策略。默認行爲是終止進程。 – alexm

+0

您提供的鏈接顯示VB特定的錯誤。你有類似的C#參考嗎? – alexm

+0

http://msdn.microsoft.com/en-us/library/hh873131.aspx是C#的參考。 – poke

6

有這個問題是,如果在dlg.ShowAsync();代碼拋出異常將被留下未處理,將被終結器線程可能導致你的程序終止後重新拋出。

在現實中會發生什麼取決於.NET異常策略

This article MSDN上提到了這一點:

如果你不等待上傳播異常的任務,或訪問其Exception屬性,當任務被垃圾收集時,異常會根據.NET異常策略升級。

當VS 2012最終出貨時,未處理任務例外的默認策略從終止過程變爲忽略例外。

-1

我遇到了同樣的問題,這是我的解決方案:

我創建任務對象,分配異步輸出函數添加到Task對象中,並使用Timer定期檢查任務的狀態。

這裏有一個簡單的例子: (在我Update_Click事件處理程序)

StatusLabel.Text = "Preparing " + feedArticleList1.Feed.Title; 
UpdateCheck.Enabled = true; 
UpdateTask = feedArticleList1.Feed.UpdateFeedAsync(); 

後來,在事件處理我的定時器,我檢查UpdateTask.Status:

switch (UpdateTask.Status) 
{ 
    case TaskStatus.Canceled: 
    case TaskStatus.Created: 
    case TaskStatus.Running: 
    case TaskStatus.WaitingForActivation: 
    case TaskStatus.WaitingForChildrenToComplete: 
    case TaskStatus.WaitingToRun: 
     StatusLabel.Text = UpdateTask.Status.ToString(); 
     break; 
    case TaskStatus.RanToCompletion: 
     StatusLabel.Text = "Update Complete " + DateTime.Now.ToShortTimeString(); 
     UpdateCheck.Enabled = false; 
     break; 
    case TaskStatus.Faulted: 
     throw (UpdateTask.Exception); 
    default: 
     break; 
} 
+1

你可以使用Exception和ContinueWith任務可以獲得同樣的效果 - 看起來您正在重新發明輪子,尤其是將輪詢引入異步方法。 – Mathieson

相關問題