Nach der HttpListener-Referenz , einem Aufruf von HttpListener. GetContext wird blockiert, bis es eine HTTP-Anforderung von einem Client erhält.
Ich frage mich, ob ich ein Timeout angeben kann, damit die Funktion nach dem Timeout zurückkehrt. Ich denke, sonst ist es unvernünftig, da Sie nicht garantieren können, dass es eine Anfrage geben wird, diese Funktion zurückzugeben, wie kann man dann diesen Anruf beenden?
P.S. Ich weiß, dass es eine async Version von ihm gibt (BeginGetContext) ABER das Problem bleibt, weil das Der entsprechende EndGetContext wird blockiert, bis eine HTTP-Anfrage eintrifft .
Daher wird es immer einen Thread geben (wenn Sie Multi-Threading durchführen), kann nicht zurückkehren, da er beim Warten auf eine Anfrage blockiert ist.
Vermisse ich etwas?
UPDATE:
Ich fand diesen Link , um nützlich zu sein. Ich fand auch, dass der Aufruf von HttpListener.Close () tatsächlich die wartenden Threads beendet, die von BeginGetContext () erstellt wurden. Irgendwie löst HttpListener.Close () die Callbacks aus, die BeginGetContext () registriert haben. Bevor Sie HttpListener.EndGetContext () ausführen, überprüfen Sie, ob HttpListener beendet wurde.
Der Callback, der EndGetContext aufruft, sollte niemals aufgerufen werden, es sei denn, eine HTTP-Anfrage ist bereits angekommen oder der Listener ist gescheitert (in diesem Fall wird EndGetContext eine Ausnahme auslösen). Daher wird es nicht blockiert, wenn es richtig verwendet wird.
BeginGetContext und EndGetContext - also asynchrone Operationen - sind was Sie wollen.
Anfangs- und Ende-Methoden funktionieren so, dass Begin sagt "Sag mir, wenn X bereit ist", und End sagt: "Gib mir das X, über das Du mir gerade signalisiert hast." Natürlich wird Letzteres in der Theorie blockieren, aber sofort zurückkehren.
Auch wenn Sie Zeile für Zeile in der Prozessverarbeitung für eine begrenzte Zeit warten möchten, gibt BeginGetContext ein System.IAsyncResult zurück, das die AsyncWaitHandle-Eigenschaft ausgibt
%Vor%Above blockiert den Thread, bis der Listener etwas Gültiges empfängt, wie es von den dem Listener zugewiesenen Hedern definiert wurde, oder er endet aufgrund einer Ausnahme, die den Listener-Thread beendet und das Ergebnis an ListenerCallback zurückgibt.
Aber die AsyncWaitHandle.WaitOne () kann Timeout-Parameter
nehmen %Vor%Der ListenerCallback könnte einen Aufruf von listener.EndGetContext enthalten oder nur den listener.EndGetContext in Zeile aufrufen, wenn kein Timeout oder Fehler durch den AsyncWaitHandle
angezeigt wird %Vor%Nicht zu vergessen, dem Listener zu sagen, dass er mit listener.BeginGetContext
erneut zuhören sollTags und Links c# httplistener