【问题标题】:Is Task.Delay safe to use in ASP.NET?Task.Delay 在 ASP.NET 中使用安全吗?
【发布时间】:2016-05-18 16:41:55
【问题描述】:

我的操作只返回带有信息的 JSON 字符串。

为了防止用户编辑每 2 秒更新一次信息的 JS 代码,我还需要一个服务器端延迟以防止高 CPU 负载。

如果有(例如)2000-5000 个用户同时执行相同的请求,使用Task.Delay(2000) 有多安全?每个用户返回的信息都不同。

【问题讨论】:

  • 我不完全明白你想要达到什么目的,但是为什么不使用某种队列并通过计时器执行操作呢?
  • @KonstantinPeshekhonov IIS 已经使用队列,支持限制结果缓存。没有必要重新发明它们
  • @AlekPsk 您所描述的不是高请求负载。 HTTP、IIS 和 ASP.NET 都有处理缓存响应的方法。您可以对单个用户响应使用输出缓存,例如使用 2 秒的小超时。您可以指定适当的标头,以便 IIS 本身在适当时返回缓存响应(例如 ETag、Expires)。您可以修改您的客户端,使其仅请求更新带有 If-Modified-Since 标头或 If-None-Match 和最后一个 ETag 的版本
  • 您还应该考虑在发生更改时使用 SignalR 将更改推送到客户端,而不是让客户端轮询服务器以获取更改。 SignalR 将为每个客户端使用最佳的可用通知机制(例如,WebSockets、无限帧、长轮询)。即使在最坏的情况下,它也比手写相同的代码更具可扩展性

标签: c# asp.net async-await


【解决方案1】:

为什么您认为添加Task.Delay(2000) 会降低CPU 负载?如果在 T 时 CPU 负载很高,添加Task.Delay(2000) 只会将高 CPU 负载推迟到 T+2,这是完全无能为力的。

一个快速的解决方案是在 UI 端检查提交频率,就像在网页上一样,禁用提交按钮并在几秒钟后再次启用它。但这可以被骗,因为前端脚本可以修改。

更安全的解决方案是在服务器端检查提交频率,在某处记录上次提交时间(例如静态变量,最简单),并拒绝无效请求。

【讨论】:

    【解决方案2】:

    Task.Delay 使用起来完全安全,因为它不涉及创建或阻塞线程,也不会使 CPU 停顿。

    另一方面,它不会帮助您,因为仍然可以从一台机器上执行多个请求。在没有进一步检查的情况下延迟执行是限制请求的无用方法。

    【讨论】:

      【解决方案3】:

      如果用户使用 asp.net 会话,除了在 asp.net 中正确的其他答案之外,还有一个您必须知道的问题,因为 asp.net 会话锁定了整个站点 直到调用返回。

      因此,如果您在会话中使用该延迟,则会阻止所有用户...请阅读:

      Does ASP.NET Web Forms prevent a double click submission?
      Web app blocked while processing another web app on sharing same session
      What perfmon counters are useful for identifying ASP.NET bottlenecks?
      Replacing ASP.Net's session entirely
      Trying to make Web Method Asynchronous

      【讨论】:

        【解决方案4】:

        如果它是关于Task.Delay,那么是的,这很好。 Task.Delay 产生一个带有计时器的任务,该任务完成后将继续执行该任务(在计时器的回调中)。考虑到它的工作方式,它不会阻塞你的线程并且不会在另一个线程上执行,所以它看起来很好。您发布的请求数量听起来也不大。

        不过,我的回答更多是关于在 ASP.NET MVC 中使用Task.Delay,而不是在您的特定场景中,如果您需要更具体的答案,您需要详细描述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          相关资源
          最近更新 更多