Ich habe eine ASP.Net MVC 4-Anwendung, die regelmäßig eine externe API für Informationen (Ressource) aufruft. Diese Ressource hat einen Ratenbegrenzer für das Konto (was bedeutet, dass andere Apps den gleichen Pool verwenden und das Limit erreichen können). Wenn dieses Limit erreicht wird, sendet es einen HTTP-Statuscode 429 mit einem Header von "Retry-After" in Sekunden zurück (etwa 25 Sekunden).
Wenn meine App diese Antwort erhält, muss ich die Ausführung um 25 Sekunden verzögern und es erneut versuchen. Zunächst einmal möchte ich sagen, dass die Methode, unter der dieser Code ausgeführt wird, eine ASP.Net 4.5 Async-Methode ist. Dafür habe ich darüber nachgedacht, System.Threading.Thread.Sleep(25000)
zu verwenden. Nun, ich mag es wirklich nicht, das zu benutzen, gibt es einen besseren Weg, dies zu tun?
Ich muss sagen, dass ich mich für diese offene Frage entschuldige, aber ich konnte nichts über die richtige Art der verzögerten Ausführung finden (während ich die Dinge asynchron halte und dafür sorge, dass uns nicht die Fäden ausgehen)
Aktualisierung: Wäre der folgende Code für die Verzögerung besser?
%Vor% Sie sollten Thread.Sleep
nicht verwenden, da es den Thread für diesen Zeitraum blockiert, sodass Ihr Server weniger skalierbar ist. Sie sollten stattdessen Task.Delay
verwenden, das asynchron ohne Blockierung wartet ein Thema:
Task.Delay
verwendet intern Timer
, um das zu erreichen. Für weitere Informationen: Thread.Sleep vs Task.Delay?
Ich empfehle Ihnen, den Block Transient Fault Handling zu verwenden , die speziell für diese Art von Szenario entwickelt wurde.
Wenn Sie jedoch einen eigenen Wiederholungsmechanismus implementieren möchten, ist Task.Delay
eine bessere Wahl als Task.Run
. + Thread.Sleep
.
25 Sekunden ist viel Zeit, um auf die Antwort auf der Clientseite zu warten, während Sie die 3rd Party API Anfrage auf dem Server verzögern. Es kann eine gute Idee sein, den Wiederholungsversuch vom Client-AJAX-Code einzuleiten, wenn Sie diese Daten / Ressourcen wirklich auf der Client-Seite benötigen. Dann müssten Sie das Warten auf der Server-Seite überhaupt nicht organisieren.
Da es scheint, dass Sie dies in ASP.NET tun, können Sie Quartz.net verwenden, um Jobs zu planen und zu ändern, wenn ein Job erneut ausgeführt werden muss (etwa 25 Sekunden). Ihre Website: Quartz Enterprise Scheduler .NET .
Eine vorherige Frage zur Verwendung von Quartz.net in ASP.NET ist hier . Hoffe, dass dir das hilft.
Tags und Links .net c# async-await asp.net-mvc-4 asp.net-4.5