在非异步函数内部调用异步函数

马西奥·俊

在我使用之前

protected async void OnResume() {
  await DoWorkAsync(); // assume exception is appropriately handled
  await DoOtherWorkAsync(); 
}

但是现在我看到其他开发人员使用

protected void OnResume() {
  SynchronizationContext.Current.Post(async (status) => {
  await DoWorkAsync(); 
  await DoOtherWorkAsync();}, null);
}

在非异步方法中调用异步方法时,第二个方法是否正确且首选?先感谢您。

更新:如果使用第二个代码段,则必须SynchronizationContext.Current.Post()在UI线程上调用,否则将得到NullReferenceException,原因SynchronizationContext.Current是在非UI线程上为null。_handler.Post(async() => {// do UI changes});可以在非UI线程上调用以进行任何UI更改,只要_handler在UI Thread上实例化即可。

斯蒂芬·克莱里(Stephen Cleary)

不,不要使用SynchronizationContext您已经在UI线程上,因此第二个选项确实没有任何意义。

请注意,通常async void应避免使用。在这种情况下,我会说这是可以接受的,因为您实际上将其OnResume 视为事件处理程序:

protected async void OnResume()
{
  await DoWorkAsync();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章