繁体   English   中英

Task.wait vs异步等待

[英]Task.wait vs async await

我一直在考虑升级我们在软件中执行异步任务的方式。 多年来,该软件一直在.net 2.5和以前的团队中运行,决定实施自己的异步任务体系结构,该体系结构在大多数情况下都可以,但是对于更复杂的事情却很难使用。

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

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

您是否仍然可以一一应用等待所有方法? 我猜因为异步返回一个任务,您将只使用它来填充列表,但这进一步加剧了我对为什么要打扰它的争论。

我的问题是,为什么您只想创建一个任务并使用.wait / .waitAll / .waitAny来使用async和await。

一项任务只是对您的承诺,将来会完成。 任务!=线程 ,这是要记住的重要事情。

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

这取决于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上运行FooOperation

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

对于async-await ,您可以使用异步WhenAny/WhenAll ,它们自身会产生一个awaitable,可以异步等待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM