[C#] Pipe sauber schließen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von MasterJulian, 12. März 2012 .

  1. 12. März 2012
    Pipe sauber schließen

    Ich arbeite mich gerade in das Thema Interprozesskommunikation mit Hilfe von Pipes ein. Vorweg: Ich weiß, dass ich Pipes auch asynchron laufen lassen kann und dann wohl keinen eigenen Thread erstellen muss. Ich möchte es aber vorerst so lösen. Mein Code sieht wie folgt aus:
    Code:
     class clsCommunication
     {
     private byte[] buffer;
     private NamedPipeServerStream pipeServer;
     private volatile bool _Stop;
     Thread serverThread;
    
     #region Configuration
     private const int _BufferSize = 512;
     private const String _PipeName = "testpipe";
     private const PipeTransmissionMode _TransmissionMode = PipeTransmissionMode.Byte;
     #endregion
    
     public clsCommunication()
    
     {
     buffer = new byte[_BufferSize]; 
     }
    
     private string ByteArrayToString(byte[] arr)
     {
     System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
     return enc.GetString(arr);
     }
    
     public void start()
     {
     _Stop = false;
     serverThread = new Thread(this.threadStart);
     serverThread.Start();
     }
    
     public void stop()
     {
     Debug.WriteLine("Server Stopping");
     _Stop = true;
     pipeServer.Close();
     pipeServer.Dispose();
     serverThread.Abort(); //serverThread.Join() just hangs
     }
    
     private void threadStart()
     {
     while (!_Stop)
     {
     pipeServer = new NamedPipeServerStream(_PipeName, PipeDirection.InOut, 1, _TransmissionMode);
     // Wait for a client to connect
     Debug.WriteLine("Pipe created, waiting for client");
     pipeServer.WaitForConnection();
     Debug.WriteLine("Client connected.");
     while (pipeServer.IsConnected)
     {
     pipeServer.Read(buffer, 0, 512);
     readcomplete(null);
     Thread.Sleep(10);
     //pipeServer.BeginRead(buffer, 0, _BufferSize, new AsyncCallback(readcomplete), null);
     }
     pipeServer.Close();
     pipeServer.Dispose();
     }
    
    
     }
     private void readcomplete(IAsyncResult result)
     {
     if (buffer[0] != 0x0)
     {
     Debug.WriteLine("Recieved: " + ByteArrayToString(buffer) );
     Debug.Write(Environment.NewLine);
     buffer = new byte[_BufferSize]; //fastest way to clear buffer?
     }
     }
     }
    Client ist ein C/C++ Programm. Im Moment ist das der Beispielcode aus der MSDN (Pipename/Modus angepasst und Read ausgeklammert).
    Das Funktioniert alles ganz gut bis auf das Schließen (stop()). Wenn ich danach wieder die start() Funktion aufrufe bekomme ich den Fehler "Alle Pipeinstanzen sind ausgelastet." in der Zeile "pipeServer = new NamedPipeServerStream(_PipeName, PipeDirection.InOut, 1, _TransmissionMode);" was merkwürdig ist, denn ich habe den PipeServer doch via Close() und Dispose() geschlossen. Jemand ne Idee?
     
  2. 13. März 2012
    AW: Pipe sauber schließen

    hallo
    ich kenne zwar diese Pipe-Klasse nicht, aber ich würde schauen, welches Pipe ich geschlossen hab und welches ich öffnen möchte.
    Ich würde mir den vorher-Zustand anschauen und dann, wie dieser Zustand aussieht, nach dem du wieder die Pipe öffnen möchtest.

    Hoffentlich hilfts dir
     
  3. 13. März 2012
    AW: Pipe sauber schließen

    Sorry aber das hilft mir nicht im geringsten. Es wird nur eine Pipe instanz erstellt. Zu schauen welche ich schließen möchte fällt somit weg. Ich habe langsam das Gefühl, dass das Problem von den verschiedenen Threads her kommt. Stop wird aus einem anderen Thread heraus gestartet als die Pipe selber. Da muss ich mich wohl doch mit den Asynchronen Methoden der Pipe auseinander setzen (v.a. WaitForConnection und EndWaitForConnection).
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.