我有要异步运行的方法:
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));
方法“ 发送”会引发我要捕获的异常,但是要做到这一点,它必须是异步Task,但是没有可等待的方法,VS想要我不要使用 async 关键字。
为什么我没有办法从Task.Run(() => void)
捕获异常,但尽管没有等待的方法,但它确实对Task.Run(async () => async Task)
有效吗?
编辑: 当我尝试过
Task.Factory.StartNew(() => { _rtuLogic.SendAsync(memoryMap, serialPort, pbProgressBar, settings); });
我无法捕获和处理异常。 如果我不使用Task.Run(...),Send不会异步运行并冻结GUI。
答案 0 :(得分:1)
现在我们有了async
时,有些人可能认为它有点过时了,但是您似乎到处都扔了async
/ await
,希望它能解决您的问题。 sup> 1
因此,我建议放弃这种尝试,而改用BackgroundWorker
。它使您可以清楚地将应在“其他地方”发生的位与仍需要访问UI的位分开,并应有助于避免阻塞UI。
Task.Run
通常应避免使用,除非您有CPU约束的工作要移出当前线程。
如果您确实想使用async
/ await
,那么理想情况下,您可以找到SendFrames
的异步变体并使用它。但是,如果尚不可用/尚未编写,则不要尝试假装是异步的。
1 一个已删除的答案已链接到this answer by Stephen Cleary,该答案又链接到有关异步的其他文章/帖子,我建议您应该尝试准备所有这些以及其他斯蒂芬·克莱尔(Stephen Cleary)的博客文章也是如此(There is no thread应该始终被推荐阅读)