30

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

4

3 に答える 3

28

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

于 2012-08-27T15:36:16.530 に答える
6

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

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

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

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

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

于 2012-06-21T21:58:00.550 に答える
-1

私は同じ問題に遭遇しました、そしてここに私の解決策があります:

Taskオブジェクトを作成し、非同期関数の出力をTaskオブジェクトに割り当て、タイマーを使用してタスクのステータスを定期的にチェックしました。

簡単な例を次に示します:(私の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;
}
于 2013-07-26T20:29:11.030 に答える