[英]Task.Run() doesn't raise exception?
我在下面的代碼中
private void Button_Click(object sender, EventArgs e)
{
try
{
Task.Run(async () => await Presenter.Search());
}
catch (Exception ex)
{
LabelMessage.Text = "Error:....";
}
}
在某些情況下, Presenter.Search()
函數可能會出現異常,我想顯示一條錯誤消息。 但是,異常不是引發嗎? 我只能在Visual Studio調試器中看到它。
確實應該這樣寫:
private async void Button_Click(object sender, EventArgs e)
{
try
{
await Presenter.Search();
}
catch (Exception ex)
{
LabelMessage.Text = "Error:....";
}
}
現在等待呼叫,並且可以正確處理異常。 請注意,出於此處列出的原因,通常不應該使用async void
,但是對於UI事件處理程序,則建議使用這種方法。
首先,如果Presenter.Search
已經返回了Task
,則應考慮使事件處理程序async
並簡單地放置
await Presenter.Search();
在try-catch塊中。
存在Task.Run(Func<Task>)
重載的原因是,您可以強制調度已經存在的Task
以在池線程上執行。 這種情況在極少數情況下是合理的,因為通常您應該依靠Task
返回方法的內部實現。 但是,如果您知道異步方法不使用線程(例如,僅返回Task
,它將在特定事件上完成),並且您對在池線程上強制執行有足夠的信心,則可以采用這種方式。 但是,在這種情況下,您還應該等待外部任務。 否則,通話即被拋棄,您將一無所獲:
await Task.Run(() => Presenter.Search());
請注意,我省略了內部的async-await:
await Task.Run(async () => await Presenter.Search());
這也將起作用,並且在功能上等效於先前版本,但是在執行的任務鏈中增加了不必要的內部狀態機。
TL; DR:在不知道任何更多詳細信息的情況下await Presenter.Search();
似乎是更好的解決方案,但也要await Task.Run(() => Presenter.Search());
如果您知道自己在做什么,就可以證明是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.