我只是學習在windows窗體應用程序中使用異步/等待,試圖讓我的Windows應用程序響應,而做慢動作。我發現處理拋出的異常有所不同。異步沒有被異步/等待塊捕獲
如果我使用WebClient.DownloadStringTaskAsync,異常是由我的代碼捕獲:
private async void button1_Click(object sender, EventArgs e)
{
try
{
this.textBox1.Text = await webClient.DownloadStringTaskAsync("invalid address");
}
catch (Exception exc)
{
textBox1.Text = exc.Message;
}
}
但是,如果我在我自己的代碼中調用一個異步函數的異常沒有被捕獲:
private string GetText()
{
throw new Exception("Tough luck!");
}
private async void button3_Click(object sender, EventArgs e)
{
using (var webClient = new WebClient())
{
try
{
this.textBox1.Text = await Task.Run(() => GetText());
}
catch (Exception exc)
{
textBox1.Text = exc.Message;
}
}
}
作爲對計算器問題Correct Way to Throw and Catch Exceptions using async/await的回答,有人建議在 工具 - >選項 - >調試 - >常規「禁用'只是我的代碼''
經過Daniel Hilgarth的評論(感謝Daniel!),我看到了一個複製粘貼錯誤。我在這裏糾正了它。問題仍然存在,但如果按照建議禁用「只是我的代碼」,則可以正確捕獲異常。
所以我想問題就解決了。
無再現。在沒有調試器的情況下運行,或者在中斷後繼續運行。你的例外很好。 –
但是,請閱讀Task.Run()並等待,它不是理想的組合。 –