【问题标题】:Does async and await increase performance of an ASP.Net applicationasync 和 await 是否会提高 ASP.Net 应用程序的性能
【发布时间】:2012-03-26 17:11:50
【问题描述】:

我最近阅读了一篇关于 c#-5 和新的和不错的异步编程特性的文章。我看到它在 Windows 应用程序中工作得更好。我的问题是这个功能是否可以提高 ASP.Net 的性能?

考虑这两个伪代码:

public T GetData()
{
    var d = GetSomeData();
    return d;
}

和

public async T GetData2()
{
    var d = await GetSomeData();   
    return d;
}

在一个 ASP.Net 应用程序中有两个代码不同的地方吗?

谢谢

【问题讨论】:

    标签: c# asp.net multithreading async-ctp c#-5.0


    【解决方案1】:

    首先,您的第二段代码将返回 Task<T> 而不是 T。最终答案是“视情况而定”。

    如果您的页面需要访问多个数据源,可能可以更简单地并行访问这些数据源,仅在必要时使用每个访问的结果。例如,您可能希望开始将长时间运行的数据获取作为页面处理的第一部分,然后只需要最后的结果。不使用 async/await 显然可以做到这一点,但是当语言帮助你时,它会简单得多。

    此外,如果这些请求中的大多数将在很长一段时间内处于空闲状态(例如在长轮询场景中),异步可用于处理少量线程上的大量长时间运行的请求。我可以看到在某些情况下,异步功能被用作SignalR 的替代方案。

    异步在服务器端的好处比在客户端更难确定,因为它有不同的帮助方式 - 而“避免在 UI 线程上工作”端很明显,很容易看到好处。

    不要忘记,服务器端编码可能不仅仅是前端。以我的经验,异步在实现 RPC 服务时最有用,尤其是那些与多个其他 RPC 服务通信的服务。

    正如 Pasi 所说,它只是语法糖 - 但我相信它是足够甜的糖,它很可能会在适当的异步处理可行与过于努力和复杂之间产生差异。

    【讨论】:

      【解决方案2】:

      定义“性能”。

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

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

      如果 Web 请求是通过异步处理程序处理的,那么响应仍然需要相同的时间才能返回 - 但是,您可以减少线程池的压力,使 Web 服务器本身更具响应性在接受请求中 - see this other SO 了解更多详情。

      【讨论】:

        【解决方案3】:

        由于代码在服务器上执行并且用户仍然需要等待响应,所以问题就像 - 异步调用是否比同步调用更快。

        嗯,这主要取决于服务器实现。对于 IIS 和多个用户,每个用户会产生太多线程(即使没有异步),并且异步效率低下。但如果用户数量较少,它应该会更快。

        一种查看方式是尝试一下。

        【讨论】:

          【解决方案4】:

          没有。这些纯粹是语法糖,通过在修复错误时允许编写简单的代码和阅读代码,让您作为程序员的工作更轻松。

          它确实允许更简单的方法来加载数据而不阻塞 UI,所以在某种程度上是的,但不是真的。

          【讨论】:

          • 在“异步太难了;让我们每个请求使用一个线程”和“异步很简单——让我们更高效地做事”之间的区别时,它将 有影响。仅仅因为它可以全部手动完成并不意味着它不能用于对性能产生实际影响。
          【解决方案5】:

          仅当您需要执行多项操作时,它才会提高性能,而这一切都可以在不需要任何其他信息的情况下完成。否则你也可以按顺序做。

          就您的示例而言,答案是否定的。无论如何,页面都需要等待。

          【讨论】:

          • 假设您需要做的“事情”是等待最多 5 分钟的聊天消息。您是否希望每个请求都占用一个线程这么长时间?您希望在一台服务器上支持多少用户? (想想一个长轮询 AJAX 请求。)
          • 不会轮询聊天消息,只需要客户端轮询,检查消息,然后返回是或否。我看不出一个线程会如何等待他们。我会根据计时器来做。除非我误解了你的问题?
          • 长轮询的要点是发出一个可以在有数据时立即返回的请求——因此客户端不需要每30秒左右轮询一次。您可以获得更快的反馈,更少的请求,但您需要能够处理非常长的持久连接。
          • 我还没有遇到过长轮询的情况(在我的工作中),但是是的,我可以看到你对这些情况的看法:)
          猜你喜欢
          • 2021-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 2015-03-07
          相关资源
          最近更新 更多