簡體   English   中英

你能解釋一下為什么如果我不等待異步任務就不會發現異常?

[英]Can you explain why the exception is not caught if I do not await an async task?

從我在代碼上遇到的問題開始,我創建了這個簡單的應用程序來重新創建問題:

private async void button1_Click(object sender, EventArgs e)
{
    Task task = Task.Run(() =>
    {
        TestWork();
    });
    try
    {
        await task;
        MessageBox.Show("Exception uncaught!");
    }
    catch (Exception) { MessageBox.Show("Exception caught!"); }
}

private async void button2_Click(object sender, EventArgs e)
{
    Task task = TestWork();
    try
    {
        await task;
        MessageBox.Show("Exception uncaught!");
    }
    catch (Exception) { MessageBox.Show("Exception caught!"); }
}

private async Task TestWork()
{
    throw new Exception();
}

button1_Click的代碼不會捕獲異常。 我已經證實這是因為我沒有等待TestWork異步方法。 事實上,我從Visual Studio發出一條警告信息告訴我,我不是在等待這種方法。 然而解決方案編譯,我害怕這可能發生在我的代碼中的其他地方,如果我廣泛使用async / await。 那么請你解釋一下原因,並且peraphs給出一些避免它的黃金法則?

PS:如果在button1_Click的代碼中我寫的是:

Task task = Task.Run(async () =>
{
    await TestWork();
});

在第一個button1_Click實現中,您忽略了TestWork返回的Task的結果。

在您的修改版本中, await檢查Exception並傳播它以供您捕獲。

實際上,您看到的編譯器警告通常很重要。 如果TestWork實際上在不同的線程上運行了某些東西,那么因為第一個實現中的包裝器Task不等待TestWork完成,所以只要TestWork啟動它就會自動完成。

用這種方式寫它會讓它更清晰:

Task task = Task.Run( () =>
    {
        Task t = TestWork();
        // ignore t
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM