ASP.Net MVC 4我需要延迟执行

hja*_*her 8 .net c# async-await asp.net-mvc-4 asp.net-4.5

我有一个ASP.Net MVC 4应用程序,它定期调用外部API来获取信息(资源).此资源具有帐户的速率限制器(意味着其他应用程序使用相同的池并可能达到限制).当达到此限制时,它将以秒为单位发回一个标题为"Retry-After"的HTTP状态代码429(比方说25秒).

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

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

更新: 以下代码是否会更好地延迟?

  await Task.Run(() => Thread.Sleep(10000))
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 15

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

await Task.Delay(10000)
Run Code Online (Sandbox Code Playgroud)

Task.Delay使用Timer内部来实现这一目标.有关更多信息:Thread.Sleep vs Task.Delay?


Ste*_*ary 7

我建议您使用专门为此类场景设计的瞬态故障处理块.

但是,如果要实现自己的重试机制,Task.Delay则比Task.Run+ 更好Thread.Sleep.