据我所知,C#中的async
/await
功能将await
调用之间的段拆分为在每个等待方法在单独返回后在调用线程上运行的回调方法工作者线程。调用线程在等待期间是“免费”的。回调必须通过某种事件循环在调用线程上安排。在控制台或网络应用程序中使用async/await
此事件循环仅存在于Windows窗体或WPF等GUI应用程序中。释放此循环可确保UI在长时间操作期间保持对其他用户交互的响应。
控制台应用程序和Web应用程序(ASP.NET)没有这种事件循环,所以此回调机制不起作用。但是再次,他们没有事件循环,因为他们不需要循环。没有用户随时试图与正在运行的程序进行交互,期待即时反馈。所以没有必要为此释放调用线程。操作使用多少个线程并不重要,它只在最后一位完成后才返回。
那么在控制台和网络应用程序中使用async
和await
还是一般的任何非交互式代码,比如Windows服务?与简单的同步调用相比,它有什么不同或更高效?
我正在设计一个由GUI和非交互式(服务和Web)程序使用的API,并且很难理解它在非GUI环境中的行为。
如果您不想每个IO操作都使用一个线程,那么它仍然非常有用。正确完成后,通过执行异步操作,只需少量线程即可处理数百个并发IO操作。 – spender