簡體   English   中英

為什么方法必須是異步任務才能捕獲異常

[英]Why method has to be async task to catch exceptions

我有要異步運行的方法

public async Task Send(MemoryMapModel memoryMap, SerialPort serialPort, ProgressBar progressBar, Settings settings)
{
    SendFrames(memoryMap, serialPort, progressBar, _token.Token, settings);
}

我通過Task.Run()這樣使用它

await Task.Run(async () => await _rtuLogic.Send(memoryMap, serialPort, pbProgressBar, settings).ConfigureAwait(false));

方法“ Send ”拋出了我想捕獲的異常,但是要做到這一點,它必須是異步Task,但是沒有可等待的方法 ,VS希望我不要使用async關鍵字。

為什么我無法從Task.Run(() => void)捕獲異常,但它確實適用於Task.Run(async () => async Task) ,盡管沒有等待的方法?

編輯:也是當我嘗試

Task.Factory.StartNew(() => { _rtuLogic.SendAsync(memoryMap, serialPort, pbProgressBar, settings); });

我無法捕捉和處理異常。 如果我不使用Task.Run(...),Send不會異步運行並凍結GUI。

現在我們有了async ,有些人可能認為它有點過時了,但是您似乎在各處都拋出async / await ,希望它能解決您的問題。 1

因此,我建議放棄這種嘗試,而改為使用BackgroundWorker 它使您可以清楚地將應在“其他地方”發生的位與仍需要訪問UI的位分開,並應有助於避免阻塞UI。

通常應避免Task.Run除非您有要移出當前線程的CPU約束工作。

如果確實要async / await那么理想情況下,您可以找到SendFrames的異步變體並使用它。 但是,如果尚不可用/尚未編寫,則不要假裝它是異步的。


1現在已刪除的答案鏈接到了Stephen Cleary的答案,該答案又鏈接到有關異步的其他文章/帖子,我建議您也應該准備所有這些以及其他Stephen Cleary博客帖子( 沒有主題)應該始終是推薦讀物)

暫無
暫無

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

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