【问题标题】:WCF service - async iimplementationWCF 服务 - 异步实现
【发布时间】:2014-11-09 04:22:05
【问题描述】:
在独立的 Windows 应用程序 (Wpf/Winforms) 中,我可以看到使用异步实现长时间运行的方法来保持 UI 响应的好处。
据我所知,IIS 将负责处理线程,例如 Web 服务在处理另一个请求时不会阻塞。
所以我的问题是:
- 在使用 async/await 实现 Web 服务时,这样做有意义吗?
- 我们是否会通过使实现异步(例如使用 async/await 关键字)获得任何性能/扩展优势。
- 要使 wcf 服务规模化并表现良好,是否可以在 config 文件中进行唯一的调优,或者还有其他需要考虑的事情吗?
我很想听听您的经验,而不仅仅是理论文章的链接。
谢谢
【问题讨论】:
标签:
performance
wcf
asynchronous
scalability
async-await
【解决方案1】:
一般来说,Web 服务可以从async/await 中获益如果它们使用自然异步操作。这是因为async 可以在等待操作完成时将 IIS 线程返回到线程池,而不是阻塞该线程。
我没有听说过很多关于 WCF 服务的数字,但在 MVC/WebAPI 方面,我听说过 10x-100x 范围内的可扩展性优势。
“自然异步”通常表示“基于 I/O”。显然,如果您只是使用Task.Run 将 CPU 绑定(或阻塞)调用卸载到线程池线程上,那么没有任何好处——您只是将一个线程换成另一个线程。但是如果你的实现是 I/O-bound,那么你可以使用async 来最大限度地利用线程池。
要记住的另一件事是整个系统的可扩展性。即,如果您的 WCF 调用全部转过来并调用单个 SQL Server 后端,那么您可能不会从扩展 WCF 中获得任何好处,因为 SQL Server 将成为您的可扩展性瓶颈。
但总的来说,我建议在您的服务器端代码上使用async/await 来进行任何自然异步工作。