次の例を検討してください。
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 番目のタスクを待つまでに完了しているので、そのまま続行できます。