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 に答える