簡體   English   中英

Task.Run()不會引發異常?

[英]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.

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