web-dev-qa-db-ja.com

この非同期呼び出しを待つ必要がないというコンパイラの警告を無視する権利はありますか?

Metroアプリケーションの一部で例外が発生したときにトリガーされる次のメソッドがあります

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キーワードを追加する必要がある理由はありますか?

30
Nilzor

以下のリンクによると、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#)

28
Ryan Horath

それに関する問題は、dlg.ShowAsync();のコードが例外をスローした場合、それは未処理のままになり、後でファイナライザースレッドによって再スローされる可能性がありますプログラムの終了。

実際に何が起こるかは、。NET例外ポリシーによって異なります。

この記事 MSDNでこれについて言及しています:

例外を伝播するタスクを待機しない場合、またはそのExceptionプロパティにアクセスしない場合、タスクがガベージコレクションされるときに、.NET例外ポリシーに従って例外がエスカレーションされます。

VS 2012が最終的に出荷されたとき、未処理のタスク例外のデフォルトポリシーは、プロセスの終了から例外を無視するように変更されました。

6
alexm