据我了解,async
/await
C# 中的功能将之间的段分开await
每个等待的方法在单独的工作线程上返回后,调用在调用线程上运行的回调方法。调用线程在等待期间是“空闲”的。必须通过某种事件循环在调用线程上安排回调。
此事件循环仅存在于 Windows 窗体或 WPF 等 GUI 应用程序中。释放此循环可确保 UI 在长时间操作期间保持对其他用户交互的响应。
控制台应用程序和 Web 应用程序 (ASP.NET) 没有此类事件循环,因此此回调机制不起作用。但话又说回来,他们没有事件循环,因为他们不需要事件循环。没有用户在任何时候尝试与正在运行的程序交互,期望立即得到反馈。因此无需为此释放调用线程。无论该操作使用多少个线程,它只会在最后一位完成后返回。
那么有什么用async
and await
在控制台和 Web 应用程序中,或者一般的任何类型的非交互式代码中,例如 Windows 服务?与简单的同步调用相比,它有何不同或更高效?
我正在设计一个供 GUI 和非交互式(服务和 Web)程序使用的 API,但很难理解它在非 GUI 环境中的行为方式。
async-await 的要点是调用线程是always当您到达第一个异步点(即第一个await
未完成的任务)。
在 UI 应用程序中,您有一个SynchronizationContext
它将等待后的代码发布到 UI 线程,因为与 UI 交互的代码必须由 UI 线程执行,否则您将收到异常。您可以通过使用来控制ConfigureAwait(false)
.
在控制台应用程序(和服务等)中没有这样的需要,因此代码可以在某些ThreadPool
线。调用线程(也可能是ThreadPool
线程)被释放,并且能够同时执行其他类型的工作,而不是同步阻塞。因此,async-await 提高了可扩展性,因为它可以使用相同数量的线程完成更多工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)