c# - ASP.Net MVC 4 Necesito retrasar la ejecución
asp.net-mvc-4 async-await (4)
25 segundos es mucho tiempo para esperar la respuesta del lado del cliente, mientras demora la solicitud de la API de terceros en el servidor. Puede ser una buena idea iniciar el reintento desde el código AJAX del cliente, si realmente necesita estos datos / recursos en el lado del cliente. Entonces no tendrías que organizar la espera en el lado del servidor.
Tengo una aplicación ASP.Net MVC 4 que periódicamente llama a una API externa para obtener información (recurso). Este recurso tiene un limitador de velocidad para la cuenta (lo que significa que otras aplicaciones usan el mismo grupo y pueden llegar al límite). Cuando se alcanza este límite, enviará un código de estado HTTP 429 con un encabezado de "Reintentar-Después" en segundos (digamos 25 segundos).
Si mi aplicación recibe esta respuesta, necesitaré retrasar la ejecución durante 25 segundos y volver a intentarlo. En primer lugar, permítanme decirles que el método con el que se ejecuta este código es un método ASP.Net 4.5 Async. Para esto, estaba pensando en usar System.Threading.Thread.Sleep(25000)
Ahora, realmente no me gusta usar esto, ¿hay una mejor manera de hacerlo?
Tengo que decir que me disculpo por esta pregunta abierta, pero no pude encontrar nada sobre la forma correcta de ejecutar la demora (mientras mantengo las cosas sincronizadas y asegurándome de que no nos quedemos sin hilos)
Actualización: ¿Sería mejor el siguiente código para la demora?
await Task.Run(() => Thread.Sleep(10000))
Como parece que está haciendo esto en ASP.NET, puede usar Quartz.net para programar trabajos y cambiar cuando un trabajo necesita ejecutarse de nuevo (digamos 25 segundos). Su sitio web: Quartz Enterprise Scheduler .NET .
Una pregunta anterior sobre el uso de Quartz.net en ASP.NET se encuentra aquí . Espero que te ayude.
No debe usar Thread.Sleep
porque bloquea el hilo durante ese período de tiempo para que su servidor sea menos escalable. En su lugar, debe utilizar Task.Delay
que espera de forma asincrónica sin bloquear un hilo:
await Task.Delay(10000)
Task.Delay
usa un Timer
internamente para lograr eso. Para más información: Thread.Sleep vs Task.Delay?
Recomiendo que use el bloque de manejo de fallas transitorias , que fue diseñado específicamente para este tipo de escenario.
Sin embargo, si desea implementar su propio mecanismo de reintento, Task.Delay
es una mejor opción que Task.Run
+ Thread.Sleep
.