【问题标题】:ASP.Net MVC 4 I need to Delay executionASP.Net MVC 4 我需要延迟执行
【发布时间】:2014-02-06 06:30:06
【问题描述】:

我有一个 ASP.Net MVC 4 应用程序,它定期调用外部 API 以获取信息(资源)。此资源对帐户有一个速率限制器(意味着其他应用程序使用相同的池并可能达到限制)。当达到此限制时,它将在几秒钟内(假设为 25 秒)发回带有“Retry-After”标头的 HTTP 状态代码 429。

如果我的应用收到此响应,我将需要延迟执行 25 秒并重试。首先,让我说运行此代码的方法是 ASP.Net 4.5 Async 方法。为此,我正在考虑使用System.Threading.Thread.Sleep(25000) 现在,我真的不喜欢使用这个,有没有更好的方法?

我不得不说我为这个开放式问题道歉,但我找不到任何关于延迟执行的正确方式(同时保持异步并确保我们不会用完线程)

更新: 下面的代码对于延迟会更好吗?

  await Task.Run(() => Thread.Sleep(10000))

【问题讨论】:

  • 25 秒是很多时间。如果同时运行您的网络应用程序的客户端浏览器超时怎么办?
  • 抱歉耽搁了,老实说,我不确定,最大延迟是 30 秒,这一切都发生在 ajax 调用期间,所以我不确定它是如何工作的。我会调查这个
  • 要进一步了解 AJAX 理念,请查看:Long Running Background Tasks in Asp.Net MVC3

标签: c# .net asp.net-mvc-4 async-await asp.net-4.5


【解决方案1】:

您不应该使用Thread.Sleep,因为它会在这段时间内阻塞线程,因此您的服务器的可扩展性较差。您应该改用 Task.Delay 异步等待而不阻塞线程:

await Task.Delay(10000)

Task.Delay 在内部使用 Timer 来实现这一点。欲了解更多信息:Thread.Sleep vs Task.Delay?

【讨论】:

  • 谢谢你,我以前看过Task.Delay,不知道为什么我一开始就没有走那条路。 Noseratio 提出了一个很好的观点,25 - 30 秒不是让浏览器超时吗?
  • 我不确定,也许您可​​以控制超时或将 api 结果缓存在您的服务器中,甚至像他建议的那样从客户端延迟它。
【解决方案2】:

我建议您使用专为此类场景设计的Transient Fault Handling Block

但是,如果你想实现自己的重试机制,Task.Delay 是比Task.Run+Thread.Sleep 更好的选择。

【讨论】:

  • 我考虑过使用瞬态故障处理,但老实说,我认为自己是初学者,无法弄清楚如何正确配置它
【解决方案3】:

25 秒是等待客户端响应的大量时间,而您正在延迟服务器上的第 3 方 API 请求。如果您在客户端确实需要此数据/资源,则从客户端 AJAX 代码启动重试可能是一个好主意。这样您就完全不必在服务器端组织等待了。

【讨论】:

    【解决方案4】:

    既然您似乎是在 ASP.NET 中执行此操作,那么您可以使用 Quartz.net 来安排作业并更改作业需要再次执行的时间(例如 25 秒)。他们的网站:Quartz Enterprise Scheduler .NET

    上一个关于在 ASP.NET 中使用 Quartz.net 的问题位于 here。希望对您有所帮助。

    【讨论】:

    • 这肯定很有趣,我会研究一下。
    • 我会犹豫在 ASP.NET 进程中的任何手动线程操作,除非您对该主题有深入的了解。请记住,IIS 可以随时关闭进程。
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2023-03-22
    • 2011-01-25
    • 2018-02-25
    • 2011-09-23
    相关资源
    最近更新 更多