考虑这个例子:
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
方法返回时已经完成 - 因为缓存。当然,或者您可能正在等待异步方法的结果以外的其他内容。
所以不,你声称等待它时等待它不会完成的说法是不正确的。
还有其他原因。考虑这段代码:
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
}
第二个任务可能会在第一个任务之前完成 - 在这种情况下,当您等待第二个任务时,它已经完成并且您可以继续进行。