我在高流量场景中有一个多层 C# MVC4 Web 应用程序,它为各种存储库使用依赖注入。这非常有用,因为它易于测试,并且在生产中我们可以轻松地为特定控制器配置存储库。所有控制器都继承自 AsyncController,因此返回Task<JsonResult>
或Task<ActionResult>
真正帮助我们的服务器扩展更多用户并解决可怕的线程饥饿问题的操作方法. 一些存储库使用 Web 服务,我们绝对可以使用 Async/Await 来提供可扩展性优势。在其他情况下,有些人可能使用无法安全线程化的非托管服务,其中 async/await 不会提供任何好处。每个存储库都是一个接口 IRepository 的实现。简而言之,每种实现在获取数据的方式上都大不相同。此配置是在部署时通过 web.config 更改和 Autofac 模块选择的。
在这样的应用程序中实现 async/await 的推荐方法有哪些?为了使模式适合我现有的应用程序,我必须将接口更改为 return Task<MyBusinessObject>
。 但这不是更多的实现细节吗? 我可以提供两个方法存根GetData
和GetDataAsync
,但对我来说,这不允许我现在使用 Autofac 等 IoC 框架所拥有的灵活性,我可以轻松地交换所有内容而无需更改代码。
Async/Await 的 Microsoft 开发人员之一发表了一篇博文,“我应该为我的同步方法公开一个异步包装器吗? ”这就是问题所在。如果您的异步方法不是真正的异步(提供本机 I/O 优势),那么它实际上只会增加开销。换句话说,它不会提供任何可扩展性优势。
我只是想知道社区的其他成员是如何解决这个问题的。