2013-07-10 8 views
10

Ich habe einen Windows-Dienst, der mit einer GUI-Anwendung über Named Pipes kommuniziert. Deshalb habe ich einen Thread laufen, der darauf wartet, dass die App eine Verbindung herstellt, was gut läuft, wenn ich es einmal mache. Wenn der Thread jedoch eine neue Instanz des Named Pipe Stream-Servers erstellt, bricht die bereits bestehende Verbindung zusammen und ich erhalte die Ausnahme für alle Instanzen. Das Codefragment, wo die Ausnahme ausgelöst wird, ist dies:Alle Instanzen beschäftigt Ausnahme auf Named Pipe Erstellung

class PipeStreamWriter : TextWriter 
{ 

    static NamedPipeServerStream _output = null; 
    static StreamWriter _writer = null; 
    static Thread myThread = null; 

     public PipeStreamWriter() 
     { 
      if (myThread == null) 
      { 
       ThreadStart newThread = new ThreadStart(delegate{WaitForPipeClient();}); 
       myThread = new Thread(newThread); 
       myThread.Start(); 
      } 
     } 

     public static void WaitForPipeClient() 
     { 
      Thread.Sleep(25000); 
      while (true) 
      { 
       NamedPipeServerStream ps = new NamedPipeServerStream("mytestp"); 
       ps.WaitForConnection(); 
       _output = ps; 
       _writer = new StreamWriter(_output); 

      } 
     } 

die Ausnahme ausgelöst wird, wenn der neuen Rohr Server Strom NamedPipeServerStream ps = new NamedPipeServerStream("mytestp") das zweite Mal, zu schaffen.

EDIT:

fand ich die Antwort und es funktioniert, wenn die maximale Anzahl von Serverinstanzen angegeben NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);

Der Standardwert für diesen -1 zu sein scheint. Was zu einer anderen, aber nicht so wichtigen Frage führt: Weiß jemand, warum es -1 ist und nicht 1, wenn es sich wie 1 verhält?

+0

sagt [hier] (https://msdn.microsoft.com/en-us/library/bb355760 (v = vs.110) aspx # ANCHOR_2) der Standardwert 1. Dennoch ist Ihre Lösung hat auch mein Problem gelöst, Prost! Ich würde darüber nachdenken, es als Antwort einzureichen, hätte eine Stimme von mir bekommen. –

+0

Ich habe mir gerade den .Net-Code bezüglich der "-1" angeschaut: Win32 erlaubt feste Werte von 1-254 oder 255, die vom System erlaubte Höchstwerte bedeuten. Wir legen 255 als -1 (unbegrenzt) über die Konstante MaxAllowedServerInstances offen. Dies ist z.B. mit -1 als unendliches Timeout, etc – derape

Antwort

0

Es gibt zwei Überlastungen des NamedPipeServerStream Konstruktor, der eine Standard zum maxNumberOfServerInstances Variablen zuweisen, nämlich:

public NamedPipeServerStream(String pipeName) 

und

public NamedPipeServerStream(String pipeName, PipeDirection direction) 

am reference source Suche zeigt, dass dieses Standard- ist und nicht -1. Dies erklärt das von Ihnen beobachtete Verhalten.

Mögliche Lösungen sind:

  1. Verwendung ein Konstruktor, der Sie die Grenze festlegen können, und einen Wert übergeben größer als 1

  2. gleiche wie 1, und verwenden Sie die integrierte Konstante NamedPipeServerStream.MaxAllowedServerInstances um die maximale Anzahl an Handles zu fragen, die das Betriebssystem zuweisen kann.