Task.wait vs async await

时间:2015-04-28 13:34:07

标签: c# .net multithreading asynchronous async-await

我一直在研究升级我们在软件中执行异步任务的方式。多年来,该软件一直在.net 2.5和之前的团队中运行,决定实施自己的异步任务架构,这在很大程度上是可以的,但很难用于更复杂的事情。

我正在观看一个教程,该教程很好地解释了C#中的任务,但后来开始查看异步方法和await关键字以使软件保持最新状态。我的问题是,为什么你会想要使用异步并等待创建一个任务并使用.wait / .waitAll / .waitAny。

我已经读过一些东西,说它不会创建新的线程(这表明它不是并行的)并且它有性能开销。

您是否仍然可以逐一应用等待方法?我猜测,因为异步返回一个任务,你只需用它来填充你的列表,但这只会进一步加深我的争论,为什么你会打扰使用它呢?

1 个答案:

答案 0 :(得分:2)

  

我的问题是,为什么你会想要使用异步并等待   创建任务并使用.wait / .waitAll / .waitAny。

任务只是对你未来的承诺。 任务!=线程,这是一件重要的事情要记住。

  

我读过的东西说它没有创建新的线程(哪个   表明它不是并行的,并且它具有性能开销。

这取决于Task的创建方式。

例如:

public async Task<string> GetPageAsync(string url)
{
    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(url);
    return response.Content.ReadAsStringAsync();
}

此操作不生成任何线程,但仍返回Task<string>。使用async-await一些开销,因为在封面下,编译器会创建一个管理执行流的状态机,它必须处理很多事情。

虽然这个:

return Task.Run(FooOperation);

请求线程池线程运行FooOperation

可以生成用于执行重叠IO(如第一个示例)操作的任务,该操作根本不需要线程。当您创建任务并使用Wait/WaitAll/WaitAny时,您在通话中阻止,然后您最终会问自己为什么要使用它而不是同步运行它?

对于async-await,您可以使用异步WhenAny/WhenAll,它们本身可以等待,可以异步等待。