Auf einer Webseite rufe ich eine dritte Partei an, die mir nicht erlaubt, die Zeitüberschreitung programmatisch zu setzen. Ich rufe BeginInvoke auf und benutze AsyncWaitHandle.WaitOne, um eine bestimmte Zeit zu warten.
Wenn der Anruf abbricht, gehe ich weiter und vergesse den Thread-Aufruf, den ich begonnen habe. Meine Frage ist, muss ich EndInvoke irgendwie in einer Timeout-Situation anrufen? Die Bemerkung "VORSICHT" auf dieser MSDN-Seite lässt mich fragen, ob ich: Ссылка
Wenn Sie glauben, ich sollte, dann ist die nächste Frage, ob meine Webseite fertig ist Verarbeitung und kehrt zum Client zurück, bevor die dritte Partei zurückkommt, wäre die Callback-Methode sogar da zu hören den Code laufen? Stört der Server nicht mehr nach Aktivität, sobald meine Anfrage / Antwort fertig ist?
Hier ist der Code, den ich verwende:
%Vor%Nun, ich konnte den Rat nicht ignorieren, den ich überall sah, dass wenn ich nicht sicher war, EndInvoke anzurufen, ICH MÖGLICHERWEISE Ressourcen ausliefern könnte, also musste ich versuchen, das nachts einschlafen zu lassen und keine Angst zu haben Annäherung an eine Klippe.
Die gefundene Lösung hat eine asynchrone Callback-Funktion verwendet. Wenn der Anruf rechtzeitig zurückkommt, rufe ich EndInvoke dort an. Wenn nicht, fahre ich mit dem Klicken fort und lasse die asynchrone Rückruffunktion das Chaos mit EndInvoke aufräumen.
Um meine eigene Frage zu einer Web-App zu beantworten und "Wer da sein wird, um nach dem Time-out zuzusehen und weiterzumachen", habe ich festgestellt - auch wenn ich die Zeit ablaufen und weitermachen würde, wenn ich mir die spätere Ausgabe ansehe , dass der asynchrone Aufruf die Rückruffunktion zurückgibt und ausführt, auch wenn ich die Ausgabe bereits an den Client zurückgegeben habe.
Ich habe etwas von dem verwendet, was ich gefunden habe: Ссылка
... und auch mit den Callback-Sachen, die ich woanders gefunden habe. Hier ist eine kleine Beispielfunktion von dem, was ich unten gemacht habe. Es kombiniert einige von dem, was ich bei Thanks für jeden Input gefunden habe!:
%Vor%Es ist möglich, dass Sie, wenn Sie EndInvoke nicht aufrufen, eine Ressource (die von BeginInvoke zugewiesen wird) durchlecken.
Um absolut sicher zu sein, rufen Sie immer EndInvoke () auf (was blockieren wird, tun Sie es auch auf einem Hintergrund Thread, den Sie nicht brauchen, oder schalten Sie einen Callback weiter, um während des Wartens keinen Thread zu brennen).
In der Praxis weiß ich nicht, wie oft es wichtig ist (ich denke, viele AsyncResults werden nicht auslaufen, so dass Sie in diesem Fall Glück haben und sicher sein können).
All dies hat fast nichts mit Request-Response- und Web-Servern zu tun, und wie funktioniert das Begin / End-Programmiermodell, unabhängig davon, in welcher Anwendung Sie es verwenden.
Aktualisierung:
Es scheint so, als müssten Sie EndInvoke immer anrufen für einen asynchronen Anruf (es sei denn sein Control .BeginInvoke) oder Risiko, Ressourcen zu verlieren.
Hier ist eine Diskussion, die in die gleiche Richtung geht . Die vorgeschlagene Lösung besteht darin, einen Thread zu erzeugen, der darauf wartet, dass der Delegat tatsächlich beendet wird und EndInvoke aufruft. Aber im Falle eines wirklich Looong Timeouts denke ich, dass Thread einfach hängen würde.
Es ist ein Randfall, der anscheinend nicht so gut dokumentiert ist ... vielleicht sollten keine Timeouts stattfinden. Ausnahmefälle
Für den allgemeinen Fall des .NET async-Patterns ist der Aufruf von EndXXX, wenn Sie den mit BeingXXX gestarteten Vorgang nicht beenden wollen, ein Fehler, denn wenn EndXXX vor dem Abschluss des Vorgangs aufgerufen wird, sollte es bis zum Abschluss blockieren. Das ist nicht viel Hilfe für ein Timeout.
Eine bestimmte API könnte anders sein (z. B. erfordert WinForms explizit kein EndInvoke).
Siehe §9.2 der "Framework Design Guidelines" (2. Ausgabe). Oder msdn .
Tags und Links timeout begininvoke