2009-11-11 5 views
2

J'ai deux programmes (Serveur/Client) Je suis en train d'installer IPC pour eux (ils tournent tous deux sur la même boîte) Utilisation System.IO.Pipes & Net 3.5C# Pipes Restons ouverts

Lorsque j'appelle ComOpen, il ouvre correctement le tube, envoie l'ID de processus au serveur, puis le tube se ferme et une erreur se produit lorsqu'il tente d'envoyer le "deuxième test d'écriture". Comment garder le tuyau ouvert pendant toute la durée du programme? (j'utilise l'ID de processus sur le serveur pour fermer tout bas si le plantage du client)

private static StreamWriter MyWriter; 
private static StreamReader MyReader; 
private static NamedPipeClientStream IPCPipe = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut); 


    public static bool MyWrite(string DataOut) 
    { 
     bool ValidPipeOut = false; 
     if(ValidComPort) 
     try 
     { 
      // Send Data 
      using (QstWriter = new StreamWriter(IPCPipe)) 
      { 
       QstWriter.AutoFlush = true; 
       QstWriter.WriteLine(QstDataOut); 
       QstWriter.Close(); 
       QstWriter.Dispose(); 
      } 
      ValidPipeOut = true; 
     } 
     catch 
     { 
      ValidPipeOut = false; 
     } 
     return ValidPipeOut; 
    } 


    public static bool ComOpen() 
    { 
     ValidComPort = true; 

     try { IPCPipe.Connect(1000); } 
     catch (Exception ex) 
     { 
      string Erroris; 
      Erroris = ex.Message; 
      if (Erroris == "Already in a connected state.") 
      { 
       // We're Already Connected, Ignore this error. 
       ValidComPort = true; 
      } 
      else 
      { 
       ValidComPort = false; 
       MessageBox.Show(Erroris); 
      } 
     } 
     if (ValidComPort) 
     { 
      string ClientProcessID = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); 
      MyReader = new StreamReader(IPCPipe); 
      ValidComPort = MyWrite(ClientProcessID); 
      ValidComPort = MyWrite("Second Write Test"); 
     } 
     return ValidComPort; 
    } 
+0

Merci d'avoir résolu ce problème. –

Répondre

1

Le problème est la ligne suivante:

using (QstWriter = new StreamWriter(IPCPipe)) 

À la fin de l'instruction à l'aide, le StreamWriter sera éliminé et celui-ci disposera à son tour de l'IPCPipe. Vous appelez également explicitement Dispose et Close sur QstWriter, ce qui fermera également le tube. Pour résoudre ce problème, supprimez l'instruction using et les appels à Dispose et Close sur QstWriter. Et assign + n'initialise QstWriter qu'une seule fois.