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

时间:2013-05-17 08:29:07

标签: .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();
    }
}

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

1 个答案:

答案 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);
}

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