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