首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在非异步函数中调用异步函数

在非异步函数中调用异步函数
EN

Stack Overflow用户
提问于 2015-11-02 15:23:42
回答 2查看 402关注 0票数 0

在我使用之前

代码语言:javascript
复制
protected async void OnResume() {
  await DoWorkAsync(); // assume exception is appropriately handled
  await DoOtherWorkAsync(); 
}

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

代码语言:javascript
复制
protected void OnResume() {
  SynchronizationContext.Current.Post(async (status) => {
  await DoWorkAsync(); 
  await DoOtherWorkAsync();}, null);
}

在非异步方法中调用异步方法时,第二个方法是否正确和首选?提前谢谢你。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 15:46:42

不,不要用SynchronizationContext。您已经进入了UI线程,因此第二个选项实际上是没有意义的。

注意,通常应该避免使用async void。在本例中,我认为这是可以接受的,因为实际上您将OnResume当作一个事件处理程序对待:

代码语言:javascript
复制
protected async void OnResume()
{
  await DoWorkAsync();
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-02 15:44:38

这两个例子都在执行不必要的工作。该方法的最佳实施将是:

代码语言:javascript
复制
protected void OnResume() 
{
    DoWorkAsync();
}

在第一种情况下,您强迫一个延续在当前上下文中运行,但该延续实际上没有什么可做的;它只是毫无意义地向同步上下文添加一个post。

第二个片段是添加两个无意义的帖子,两个是当前的同步上下文,一个是显式的,另一个是隐式的。

这两种方法都有添加状态机的async方法,即使您实际上没有利用其中的任何功能,所以这些开销都是完全浪费的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33481047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档