我有以下方法提交对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();
}
上述方法是否可以安全使用,或者我应该:
async-await
或ContinueWith
答案 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
出现问题