async和await是否会提高ASP.Net应用程序的性能

Ari*_*ian 14 c# asp.net multithreading c#-5.0 async-ctp

我最近阅读了一篇关于c#-5新的和漂亮的异步编程功能的文章.我看到它在Windows应用程序中运行很好.问题来自我是否可以提高ASP.Net的性能?

考虑这两个psudo代码:

public T GetData()
{
    var d = GetSomeData();
    return d;
}
Run Code Online (Sandbox Code Playgroud)

public async T GetData2()
{
    var d = await GetSomeData();   
    return d;
}
Run Code Online (Sandbox Code Playgroud)

在ASP.Net中有两个代码差异吗?

谢谢

Jon*_*eet 15

好一开始你的第二段代码将返回Task<T>而不是T.最终的答案是"它取决于".

如果您的页面需要访问多个数据源,则可以更轻松地并行访问这些源,只在必要时使用每次访问的结果.因此,例如,您可能希望开始将长时间运行的数据提取作为页面处理的第一部分,然后只需要最后的结果.显然可以在不使用async/await的情况下执行此操作,但是当语言帮助您时,它会更简单.

此外,如果大多数请求在很多时候都处于空闲状态,例如在长轮询场景中,异步可用于处理少量线程上的大量长时间运行请求.在某些情况下,我可以看到异步能力被用作SignalR的替代品.

服务器端异步的好处比客户端更难确定,因为它有不同的帮助方式 - 而"避免在UI线程上工作"这一点非常明显,很容易看出它的好处.

不要忘记服务器端编码可能比前端更多.根据我的经验,异步最有可能在实现RPC服务时很有用,特别是那些与多个其他 RPC服务通信的服务.

正如Pasi所说,它只是语法糖 - 但我相信它是足够甜的糖,它可能使正确的异步处理之间的差异变得可行,而且它只是太多的努力和复杂性.


And*_*tan 6

定义'表现'.

最终,应用程序将执行与同步完成相同的工作量,这只是异步版本中的调用线程将等待操作在另一个上完成,而在同步模型中它是相同的线程执行任务.

最终,在这两种情况下,客户端都会在看到来自Web服务器的响应之前等待相同的时间,因此不会发现任何性能差异.

如果通过异步处理程序处理Web请求,那么响应仍然会花费相同的时间返回 - 但是,您可以减少线程池的压力,使Web服务器本身在接受请求时更具响应性- 有关详细信息,请参阅此其他SO.