在同一方法中使用多个等待的效果?

时间:2016-05-02 07:08:13

标签: c# asynchronous async-await

我有以下方法提交对db的更改(使用Entity Framework):

public async Task<int> CommitAsync(Info info)
{
    if (this.Database.Connection.State == ConnectionState.Closed)
        await this.Database.Connection.OpenAsync();

    await SetInfo(info);
    return await base.SaveChangesAsync();
}

上述方法是否可以安全使用,或者我应该:

  1. 避免使用async-await
  2. 使用ContinueWith

2 个答案:

答案 0 :(得分:13)

在同一个异步方法中使用多个await表达式绝对没问题 - 否则它将是相对无用的功能。

基本上,该方法将同步执行,直到它到达尚未完成的等待所涉及的第一个await。然后它将返回给调用者,为等待执行剩余的异步方法设置了延续。如果稍后执行到达另一个尚未完成等待的await表达式,则会在上设置等待等等的继续。

每次方法从await“恢复”时,它都会继续执行它停止的位置,使用相同的局部变量等。这是由编译器代表您构建状态机来实现的。

答案 1 :(得分:3)

您的代码看起来很完美。它让你的来电者有机会在你等待的时刻做一些有用的事情,而不是每个人都忙着等待一切都结束。

使用async-await而不是使用ContinueWith的好处是你的代码看起来相当同步。很容易看出语句的执行顺序。 ContinueWith还允许您指定顺序,但它更难以看到。

如果线程进入异步过程,它将执行该过程,直到遇到等待。而不是等到等待的程序结束,控制权将返回给你的调用者,他可以继续执行下一个语句,直到他遇到等待,然后控制给他的调用者等。一旦每个人都在等待你的OpenAsync完成线程继续在OpenAsync之后执行语句,直到它遇到另一个等待。

有人在stackoverflow(唉失去了他的名字)中解释了我breakfast metaphor中的async-await进程。

非常有用的介绍,Stephen Cleary about Async-await。让您也了解async-await如何防止InvokeRequired

出现问题