C#异步等待澄清?

时间:2013-06-29 12:15:13

标签: c# .net-4.5 async-await c#-5.0

我已阅读here

  

等待检查等待以查看是否已经完成;如果   等待已经完成,然后方法继续   运行(同步,就像常规方法一样)。

什么?

当然它还没有完成,因为它还没有开始!

示例:

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

此处await检查等待审核是否已经完成 (根据文章),但它(DoSomething)还没有事件开始了! ,因此结果总是false

如果文章要说:

  

等待检查是否等待已经完成   在x毫秒内; (超时)

我可能在这里遗漏了一些东西..

2 个答案:

答案 0 :(得分:13)

考虑这个例子:

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
}

第二个任务可能在第一个任务之前完成 - 在这种情况下,当你等待第二个任务时,它将完成,你可以继续前进。

答案 1 :(得分:3)

await可以接受任何TaskTask<T>,包括已完成的任务

在您的示例中,内部DoSomething()方法(应该命名为DoSomethingAsync()及其调用者DoSomethingElseAsync())返回Task(或Task<T> })。该任务可以是从其他地方获取的已完成任务,该方法不需要启动自己的任务。