2009-06-06 30 views
1

Ich habe ein IPC-Problem. Ich habe in einem Windows-Dienst eine NamedPipeServer erstellt:IPC Windows Service Windows Forms

serverPipe = new NamedPipeServerStream(Constants.PIPE_NAME, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); 
Thread thread = new Thread(new ThreadStart(pipeWork)); 
thread.Start(); 

wo Leitungsbau ist

private static void pipeWork() 
{ 
    try 
    { 
     byte[] buffer = new byte[1024]; 
     while (true) 
     { 
      if (!serverPipe.IsConnected) 
       serverPipe.WaitForConnection(); 
      int nr = serverPipe.Read(buffer, 0, buffer.Length); 
      String str=Encoding.Default.GetString(buffer); 

     … 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

und in einer Windows Forms-I der Client

clientPipe = new NamedPipeClientStream(".", PhotoServiceClassLibrary.Constants.PIPE_NAME, PipeDirection.InOut,PipeOptions.Asynchronous); 
       clientPipe.Connect(); 
       clientPipe.ReadMode = PipeTransmissionMode.Message; 

pipeThread=new Thread(new ThreadStart(pipeWork)); 
      pipeThread.Start(); 

wo Leitungsbau ist

private void pipeWork() 
{ 
    try 
    { 
     while (true) 
     { 
      using (StreamReader sr = new StreamReader(clientPipe)) 
      { 
       string message; 

       while ((message = sr.ReadLine()) != null) 
       { 

        … 

       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

ich wan t, wenn der Dienst beginnt eine Aktion ein Context aus den Fenstern Formen zu deaktivieren, für die der Dienst eine Nachricht in einen Streamwriter sw schreibt:

 StreamWriter write = null; 
     write = new StreamWriter(serverPipe); 

     if (serverPipe.IsConnected) 
     { 
      write.Write(message); 
      write.Flush(); 
     } 

Der Code ist richtig, weil ich für die Prüfung eine andere Windows-Formen geschaffen, die die implementiert Gleiche Dinge wie der Windows-Dienst und die Kommunikation zwischen Windows-Formulare Pipe-Server -> Windows-Formulare Pipe-Client funktioniert gut. Das Problem ist, dass das Windows-Formular - Client-Pipe nicht die Nachricht von Windows-Dienst - Server-Pipe erhalten.

Ich weiß, dass WCF eine bessere Idee sein kann, aber ich möchte verstehen, warum nicht auf Low-Level-IPC funktioniert. Warum? Ich habe ein sehr merkwürdiges Verhalten gesehen. Mein Dienst interagiert 2 mal mit den Windows-Formularen: 1.My Dienst ist zum Herunterladen von einigen Fotos konzipiert. Wenn er mit dem Download beginnt, sendet er eine Nachricht an die Windows-Formulare, um ihn darüber zu informieren. 2.Wenn ich den Dienst stoppe sendet er eine Nachricht an Windows Forms und er stoppt auch. Ich habe gerade festgestellt, dass beide Nachrichten erst nach dem Beenden des Dienstes beim Windows-Agenten eintreffen. Kann jemand erklären warum?

Antwort

1

Ich hoffe, das ist nicht dein richtiger Code. Es ist gut, dass Sie versuchen, Blöcke um den Code Ihrer ThreadStart-Handler zu fangen (andernfalls würde eine Ausnahme den Thread nur leise löschen). Wenn Sie jedoch die Ausnahme im catch-Block nicht protokollieren, ist es genauso schlimm.

Sie haben ein Rätsel (Server erhält keine Nachricht), und Sie verbergen Informationen (eine Ausnahme ist aufgetreten). Wenn Sie Informationen nicht ausblenden, haben Sie möglicherweise die Antwort für Ihr Geheimnis (Server erhält keine Nachricht, weil eine Ausnahme aufgetreten ist).

+0

nein, das ist nicht mein richtiger Code. Mein realer Code ist: Versuch { [...] } fangen (Ausnahme ex) { werfen Sie ex; } – user61652

+0

und, nein, ich habe keinen Fehler ... was soll ich tun, um einen Windows-Dienst mit einem Windows-Formulare durch eine Namedpipe zu kommunizieren ??? – user61652

+0

Wenn Sie die Ausnahme noch einmal werfen, werfen Sie ";" nicht "werfen Sie ex;".Besser noch, wenn du es nur noch einmal nachholen willst, dann fang es nicht. Am besten, fangen Sie es ab und protokollieren Sie es. –