Frage

Ich habe nicht in der Lage gewesen, einen Weg zu finden, löschen / beenden asynchronen Lesevorgang nach erfolgreichem HttpWebRequest. Es gibt keine Möglichkeit Timeout einstellen, wird ThreadPool.RegisterWaitForSingleObject nicht zu arbeiten. Und die zugrunde liegende Buchse schließen keine Option auch, weil weder HttpWebRequest / Reponse zugänglich zu machen.

Edit:

Leider dieser Ansatz, die Sunny suggestet nur für HttpWebRequest.BeginGetResponse arbeitet. Für den Strom, die Sie nach GetResponseStream () aus irgendeinem Grund RegisterWaitForSingleObject bekommen funktioniert nicht - der Rückruf nie genannt wird.

Die Situation ist folgende: Ich habe eine Anwendung, die HttpGetRequest verwendet. Es ist zu bauen, indem den Standard MSDN Beispiel für asynchrones httpwebrequest verwenden. Antwort zu erhalten ist wie ein Zauber funktioniert. Aber in seltenen Fällen der Server, meine httpwebrequest zu vergisst verbindet die Steckdose zu schließen. Also ich bin auf einem unendlichen Lese von Beginread hing.

In einigen seltenen Fällen der andere Server vergessen

War es hilfreich?

Lösung

Warum nicht RegisterWaitForSingleObject? Sie können es für Zeit verwenden aus, und im Handler können Sie anrufen request.Abort ().

Hier ist ein Beispiel . Btw, habe ich simial Ansatz verwendet, bevor ich diesen Artikel in der Vergangenheit gefunden, und es funktionierte wie ein Charme.

Hinweis: Das eigentliche Ende der Operation auf dem nächsten Stream.Read passieren wird (nur der Request / Response war async) oder Stream.EndRead (wenn das Lesen async auch ist). Sie müssen noch die Ausnahme in dem EndXXXX Handler geworfen erfassen.

EDIT: Wenn der RegisterWaitForSingleObject nie gecallt, dann haben Sie eine andere Frage, die höchstwahrscheinlich ein Threadpool nicht genügend freie Threads hat. Der Rückruf für RegisterWaitForSingle Objekt ist auf einem Threadpool-Thread aufgerufen, und wenn es keinen ein freier Thread im Pool ist, es wird nie aufgerufen. Sie haben einige Lösungen:

  1. Erstellen Sie Ihre Seiten asynchron. Wie .
  2. Ändern Sie die max Threads im Pool .

In jedem Fall wird die Poolgröße zu erhöhen Sie nicht zu viel. Sie haben Ihren Code für Ressourcen (Strom) Lecks zu überprüfen, und stellen Sie sicher, dass Sie nicht nur request.Abort () aufrufen, sondern auch die Reaktion schließen. Stellen Sie sicher, als in Ihrem Rückruf Sie die richtige EndXXX Methode verwenden, etc.

I nazdrave:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top