C# Net MVC 4我需要延迟执行

C# Net MVC 4我需要延迟执行,c#,.net,asp.net-mvc-4,async-await,asp.net-4.5,C#,.net,Asp.net Mvc 4,Async Await,Asp.net 4.5,我有一个ASP.NETMVC4应用程序,它定期调用外部API以获取信息(资源)。此资源具有帐户的速率限制(意味着其他应用程序使用相同的池,并且可能达到该限制)。当达到此限制时,它将在几秒钟内(比如说25秒)发回一个HTTP状态代码429,标题为“Retry After” 如果我的应用程序收到此响应,我需要将执行延迟25秒,然后重试。首先,让我说运行此代码的方法是ASP.NET4.5异步方法。为此,我考虑使用System.Threading.Thread.Sleep(25000)现在,我真的不喜欢

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

如果我的应用程序收到此响应,我需要将执行延迟25秒,然后重试。首先,让我说运行此代码的方法是ASP.NET4.5异步方法。为此,我考虑使用
System.Threading.Thread.Sleep(25000)
现在,我真的不喜欢使用这个,有更好的方法吗

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

更新: 以下代码对延迟是否更好

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

您不应该使用
Thread.Sleep
,因为它会在一定时间内阻塞线程,因此服务器的可伸缩性较差。您应该改为使用异步等待而不阻塞线程的:

await Task.Delay(10000)

Task.Delay
在内部使用
计时器来完成该任务。有关详细信息:

由于您似乎是在ASP.NET中执行此操作,因此您可以使用Quartz.NET计划作业,并在需要再次执行作业时进行更改(例如25秒)。他们的网站:

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

我建议您使用,它是专为此类场景设计的


但是,如果您想要实现自己的重试机制,则是比
任务更好的选择。运行
+
线程。睡眠

在服务器上延迟第三方API请求的同时,在客户端等待响应需要25秒。如果您确实需要客户端上的数据/资源,那么最好从客户端AJAX代码启动重试。这样您就不必在服务器端组织等待。

25s是一段很长的时间。如果运行web应用程序的客户端浏览器同时超时怎么办?很抱歉,我不能确定延迟的最大时间是30秒,而这一切都发生在ajax调用期间,所以我不确定这是如何工作的。我将对此进行研究为了进一步了解AJAX思想,请检查以下内容:。这确实很有趣,我将对此进行研究。除非您对该主题有深入的了解,否则我将对ASP.NET进程中的任何手动线程操作表示怀疑。请记住,IIS可以在任何需要的时候关闭进程。我已经考虑过使用暂时的故障处理,但说实话,我认为自己是初学者,不知道如何正确地配置它。谢谢你,我已经看到了任务。NoStratio提出了一个很好的观点,25-30秒不就是浏览器超时吗?我不确定,也许你可以控制超时,或者把api结果缓存到你的服务器中,甚至像他建议的那样从客户端延迟它。