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

时间:2015-11-02 15:23:43

标签: c# android xamarin

在我使用之前

"

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

newConnectionString

在非异步方法中调用异步方法时,第二个是正确的吗?提前谢谢。

更新:   如果您使用第二个代码段,则必须在UI线程上调用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); } ,因为在非UI线程上SynchronizationContext.Current.Post()为空。只要在UI线程上实例化NullReferenceException,就可以在非UI线程上调用SynchronizationContext.Current来进行任何UI更改。

2 个答案:

答案 0 :(得分:2)

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

protected void OnResume() 
{
    DoWorkAsync();
}

在第一种情况下,您强制继续在当前上下文中运行,但该延续没有任何实际操作;它只是毫无意义地在同步上下文中添加了一个帖子。

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

这两种方法也有async种添加状态机的方法,即使你实际上并没有充分利用这些功能,所以这些开销都完全被浪费了。

答案 1 :(得分:2)

不,请勿使用SynchronizationContext。你已经在UI线程上,所以第二个选项真的没有意义。

请注意,通常应避免使用async void。在这种情况下,我认为这是可以接受的,因为您实际上正在处理OnResume ,就好像它是事件处理程序一样:

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