Task.wait 与异步等待

Task.wait vs async await

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

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

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

你还能用一个一个等待的方法吗?我猜自异步 returns 以来,您只需使用它来填充您的列表的任务,但这只会进一步加深我关于您为什么要费心使用它的论点?

My question is, why you would want to use async and await over just creating a task and using .wait/.waitAll/.waitAny.

任务只是你对未来的承诺。 Task != Thread ,记住这一点很重要。

I have read things that say that it isn't creating new threads (which suggests its not as parallel) and that it has a performance overhead.

这取决于 Task 的创建方式。

例如:

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

此操作不生成线程,但仍然 returns 一个 Task<string>。使用 async-await一些 开销,因为在幕后,编译器创建了一个状态机来管理执行流程,它必须处理很多事情。

同时:

return Task.Run(FooOperation);

请求一个线程池线程到运行FooOperation上。

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

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