在控制台或 Web 应用程序中使用 async/await

ygo*_*goe 5 .net c# multithreading async-await

据我了解, C# 中的async/await功能将调用之间的段拆分await为回调方法,这些回调方法在每个等待的方法在单独的工作线程上返回后在调用线程上运行。调用线程在等待期间是“空闲”的。必须通过某种事件循环在调用线程上安排回调。

此事件循环仅存在于 Windows 窗体或 WPF 等 GUI 应用程序中。释放此循环可确保 UI 在长时间操作期间保持对其他用户交互的响应。

控制台应用程序和 Web 应用程序 (ASP.NET) 没有此类事件循环,因此此回调机制不起作用。但话又说回来,他们没有事件循环,因为他们不需要事件循环。没有用户在任何时候尝试与正在运行的程序交互,期望立即得到反馈。因此无需为此释放调用线程。无论该操作使用多少个线程,它只会在最后一位完成后返回。

那么,在控制台和 Web 应用程序或任何类型的非交互式代码(例如 Windows 服务)中,async和的用途是什么?await与简单的同步调用相比,它有何不同或更高效?

我正在设计一个供 GUI 和非交互式(服务和 Web)程序使用的 API,但很难理解它在非 GUI 环境中的行为方式。

i3a*_*non 4

async-await 的要点是,当您到达第一个异步点(即第一个未完成任务)时,调用线程总是被释放。await

在 UI 应用程序中,您可以将SynchronizationContext等待后的代码发布到 UI 线程,因为与 UI 交互的代码必须由 UI 线程执行,否则您将收到异常。您可以使用 来控制它ConfigureAwait(false)

在控制台应用程序(和服务等)中没有这样的需要,因此代码在某个ThreadPool线程上运行。调用线程(可能也是一个ThreadPool线程)被释放,并且能够同时执行其他类型的工作,而不是同步阻塞。因此,async-await 提高了可扩展性,因为它可以使用相同数量的线程执行更多工作。