2
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() 那么它会按预期立即返回。

4

1 回答 1

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

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

于 2013-05-17T08:39:02.533 回答