public class MyClass
{
MyEntities db = new MyEntities();
public MyClass()
{
this.Initialise(); // Does not return immediately. Why?
}
private async void Initialise();
{
await this.db.Entities.LoadAsync();
}
}
如果我更改Initialise以使用await Task.Run()来调用同步this.db.Entities.Load(),那么它会按预期立即返回。
答案 0 :(得分:5)
代码将执行到第一个等待点(对于尚未完成的数据)。请注意Initialise
是有效的:
var tmp = this.db.Entities.LoadAsync();
await tmp;
因此,我们必须得出结论,LoadAsync
在屈服之前花了不少的时间。这完全符合API限制 - await
API仅有助于使事情变得可以接受;它不保证一切都在非阻塞。例如,以下是完全可以接受的:
static Task<int> Evil() {
Thread.Sleep(60000);
return Task.FromResult(4);
}
可能是数据上下文正在加载元数据,加载程序集等 - 在它知道它是否可以产生之前。