3

私はここでそれを読んだ:

Await は、awaitableが既に完了しているかどうかを調べます。awaitable が既に完了している場合、メソッドは実行を継続します (通常のメソッドと同様に同期的に)。

何 ?

もちろん、まだ始まっていないのだから、完成するわけではありません!

例 :

public async Task DoSomethingAsync()
{ 
  await DoSomething();
}

ここでawaitは、(記事によると) 既に完了しているかどうかを確認するために awaitable を調べますが、(DoSomething)イベントはまだ開始されていません! 、したがって、結果は常にfalse

記事が次のように言うなら、それは理にかなっています:

Await は、awaitable がミリ秒以内に完了し たかどうかを調べます。x(タイムアウト)

私はおそらくここで何かを見逃しています..

4

2 に答える 2

15

次の例を検討してください。

public async Task<UserProfile> GetProfileAsync(Guid userId)
{
    // First check the cache
    UserProfile cached;
    if (profileCache.TryGetValue(userId, out cached))
    {
        return cached;
    }

    // Nope, we'll have to ask a web service to load it...
    UserProfile profile = await webService.FetchProfileAsync(userId);
    profileCache[userId] = profile;
    return profile;
}

別の非同期メソッド内でそれを呼び出すことを想像してください。

public async Task<...> DoSomething(Guid userId)
{
    // First get the profile...
    UserProfile profile = await GetProfileAsync(userId);
    // Now do something more useful with it...
}

によって返されたタスクGetProfileAsyncが、キャッシュのために、メソッドが返されるまでに既に完了している可能性は十分にあります。もちろん、非同期メソッドの結果以外の何かを待っている可能性もあります。

いいえ、あなたが待っている時までに awaitable が完了しないというあなたの主張は真実ではありません。

他にも理由があります。次のコードを検討してください。

public async Task<...> DoTwoThings()
{
    // Start both tasks...
    var firstTask = DoSomethingAsync();
    var secondTask = DoSomethingElseAsync();

    var firstResult = await firstTask;
    var secondResult = await secondTask;
    // Do something with firstResult and secondResult
}

2 番目のタスクが最初のタスクの前に完了する可能性があります。その場合、2 番目のタスクを待つまでに完了しているので、そのまま続行できます。

于 2013-06-29T12:24:28.520 に答える
4

awaitは、完了したタスクを含め、任意のTaskまたはを取ることができます。Task<T>

あなたの例では、内部DoSomething()メソッド(むしろ名前が付けられDoSomethingAsync()、その呼び出し元)が(またはDoSomethingElseAsync())を返します。そのタスクは、別の場所からフェッチされた完了済みのタスクである可能性があり、メソッドは独自のタスクを開始する必要はありません。TaskTask<T>

于 2013-06-29T12:17:31.540 に答える