异步void方法不立即返回(EF6)

Mon*_*eur 2 .net entity-framework async-await entity-framework-6

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我更改Initialise以使用await Task.Run()来调用同步this.db.Entities.Load()然后它会按预期立即返回.

Mar*_*ell 5

代码将执行到第一个等待点(对于尚未完成的数据).请记住,这Initialise是有效的:

var tmp = this.db.Entities.LoadAsync();
await tmp;
Run Code Online (Sandbox Code Playgroud)

因此,我们必须得出结论,LoadAsync在它屈服之前花了不少的时间.这完全符合API限制 - awaitAPI仅有助于使事情等待; 它不保证一切都在非阻塞.例如,以下是完全可以接受的:

static Task<int> Evil() {
    Thread.Sleep(60000);
    return Task.FromResult(4);
}
Run Code Online (Sandbox Code Playgroud)

可能是数据上下文正在加载元数据,加载程序集等 - 在它知道它是否可以产生之前.