2016-04-20 10 views
1

Ich versuche, eine Named Pipes-Verbindung zwischen einer Server-Software und einem Client einzurichten.Named Pipes Server wird ohne Warnung beendet

Dies ist mein Server-Code:

class Program 
{ 
    private static NamedPipeServerStream server = new NamedPipeServerStream("p", PipeDirection.InOut); 
    static void Main(string[] args) 
    { 
     Action<NamedPipeServerStream> a = callBack; 
     a.BeginInvoke(server, ar => { }, null); 
    } 

    private static void callBack(NamedPipeServerStream pipe) 
    { 
     pipe.WaitForConnection(); 
     var line = ""; 
     while (line != "exit") 
     { 
      try 
      { 
       StreamReader reader = new StreamReader(pipe); 
       while (line != "exit") 
       { 
        line = reader.ReadLine(); 
        switch (line) 
        { 
         default: 
          foo(); 
          break; 
        } 
       } 
       break; 
      } 
      catch (IOException) 
      { 
       pipe.Disconnect(); 
       continue; 
      } 
     } 
    } 
} 

Aber wenn ich versuche, diese Anwendung auszuführen es direkt nach dem Start beendet.

Ich habe den Debugger verwendet, um die WaitForConnection-Linie zu erreichen und dann wird es ohne einen Fehler oder eine Ausnahme beendet. Und es läuft nichts als der Server.

Es wird beendet, ohne vom Catch-Teil behandelt zu werden. Fehle ich etwas?

Antwort

1

Die Ausführung wird auf WaitForConnection blockiert und wird nicht fortgesetzt, bis ein NamedPipeClientStream-Objekt eine Verbindung mit dem NamedPipeServerStream-Objekt herstellt.

Bitte sehen Sie hier (Das Beispiel sollten Ihnen helfen): https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx

EDIT: Ich habe das Problem falsch verstanden und dachte ursprünglich, dass die Frage mit der Ausführung von waitForConnection Methode blockiert zu tun hatte. Der folgende Code ist die Ergänzung zur eigentlichen Frage sowie meine Erklärung.

Das Problem ist die Art, wie Sie Ihre Aktion aufrufen. Wenn Sie BeginInvoke aufrufen, wird es in einem Threadpool-Thread asynchron aufgerufen. Dazu müssen Sie überprüfen, ob die Aktion beendet ist oder nicht, ansonsten läuft der Haupt-Thread weiter und erreicht das Ende. Ich habe meine Antwort aktualisiert, wie Sie dies sehr einfach tun können

Hoffentlich hilft dieser Code Ihnen zu verstehen, warum es existiert! :)

 Action<NamedPipeServerStream> a = callBack; 
     var result = a.BeginInvoke(server,ar => { },null); 

     while (!result.IsCompleted) 
     { 

     } 
+0

Ich weiß, dass die Ausführung normal blockiert wird. Aber in diesem Fall endet das ganze Programm. – Snickbrack

+0

@Snickbrack Ahh okay, Entschuldigungen. Ich dachte, du meintest, indem du sagst "Und es läuft nichts außer dem Server", dass es weiter lief, aber nicht weiter in den Code ging. Ich werde genauer hinsehen und zu dir zurückgehen –

+0

@Snickbrack Das Problem ist die Art, wie du deine Aktion aufrufst. Wenn Sie BeginInvoke aufrufen, wird es in einem Threadpool-Thread asynchron aufgerufen. Dazu müssen Sie überprüfen, ob die Aktion beendet ist oder nicht, ansonsten läuft der Haupt-Thread weiter und erreicht das Ende. Ich habe meine Antwort darauf aktualisiert, wie Sie das sehr leicht machen können –