NamedPipeServerStream.EndWaitForConnection() nur hängt, wenn verwendet

Ich versuche, die named pipes verwenden, für die erste Zeit. In der MS-Dokumentation gefunden hier, es besagt, dass:

EndWaitForConnection muss aufgerufen werden genau einmal für jeden Aufruf
BeginWaitForConnection.

Ich versuche also ein wenig gute Programmierer und Folgen Sie der Dokumentation, aber die EndWaitForConnection() hängt sich auf unbestimmte Zeit, wenn ich es verwenden.

Also ich zerlegte meinen code auf ein absolutes minimum, so sehen, wenn ich könnte das problem einzugrenzen, aber keine Würfel. Ich habe zog Sie den folgenden code aus einer Klasse, die ich geschrieben habe. Ich habe es geändert, so dass es beginnt das warten auf eine pipe-Verbindung dann sofort versucht, zu stoppen und warten auf das pipe-Verbindung:

private void WaitForConnectionCallBack(IAsyncResult result)
{

}

public void Start()
{
    var tempPipe = new NamedPipeServerStream("TempPipe",
                                             PipeDirection.In,
                                             254, 
                                             PipeTransmissionMode.Message,
                                             PipeOptions.Asynchronous);

    IAsyncResult result = tempPipe.BeginWaitForConnection(
                                    new AsyncCallback(WaitForConnectionCallBack), this);

    tempPipe.EndWaitForConnection(result);  //<----- Hangs on this line right here
}

1) Warum macht es hängen EndWaitForConnection()? Wenn ich heruntergefahren meinem server, bevor ich bekommen habe, eine Verbindung, wie kann ich im wesentlichen heben diese BeginWaitForConnection() Rückruf?

2) nehmen wir an, dass ich nicht das oben erwähnte problem. Was passiert, wenn 2 clients versuchen, eine Verbindung zu meinem benannte pipe sehr schnell?

Bekomme ich einen callback-Aufruf für jeden von Ihnen, oder muss ich warten, bis die erste Verbindung die Benachrichtigung dann schnell anrufen EndWaitForConnection() dann WaitForConnectionCallBack() wieder starten Sie hören für den nächsten Kunden wieder?

Letztere scheint wie eine race-condition zu mir, denn ich kann nicht die Verbindung aufzubauen Zuhörer schnell genug.

  • Durch design, ist dieser Aufruf sollte nur verwendet werden, in der callback-Methode (WaitForConnectionCallBack). Sie kündigen es durch den Aufruf tempPipe.Schließen().
  • Ja, ich habe irgendwie zufällig auf, dass die Schlussfolgerung selbst. Im wesentlichen habe ich gefunden, dass der Aufruf tempPipe.Close() wird die callback-routine bewegen sofort, problem ist, ich habe es eingerichtet, um sofort anrufen EndWaitForConnection, aber da das Rohr geschlossen ist, dann wirft er eine exception. Also musste ich wickeln Sie einen try-Anweisung um, und nichts tun, in der catch-Anweisung. Ist dies die richtige Lösung? Es scheint ein wenig schlampig auf mich zu schließen das Rohr, das wissen, es zu zwingen, eine Ausnahme in Ihrem Rückruf, dass Sie haben zu fangen.
  • Das ist völlig normal.
  • Ich war nur Codierung bis im wesentlichen die gleiche Sache, und auch ich war überrascht, dass ObjectDisposedException im callback. Seit Wann ist der Umgang mit einer Ausnahme das "voraussichtlich" Weg, Dinge zu tun? Ich sage nicht, Sie sind falsch, aber ist das sinnvoll? Ist dies die Art, wie es funktionieren sollte?
  • Ja, es ist ganz normal. Der asynchrone Aufruf abgeschlossen wird, wird die exception sagt, warum. Fangen Sie nicht alle, wie die Antwort, hab erst fangen ODE.
InformationsquelleAutor Ultratrunks | 2012-02-04
Schreibe einen Kommentar