2013-07-10 19 views
10

Adlandırılmış borular aracılığıyla bir gui uygulamasıyla iletişim kuran bir windows hizmetim var. Bu yüzden ben bir kez yapmak eğer ince çalışıyor bağlamak için app için bekleyen çalışan bir iş parçacığı var. Ancak iş parçacığı, adlandırılmış yöneltme sunucusunun yeni bir örneğini oluşturuyorsa, zaten kurulmuş olan bağlantı bozulur ve tüm örneklerin meşgul özel durumunu alırım. özel durum kod parçası şudur: yeni boru sunucu akışı NamedPipeServerStream ps = new NamedPipeServerStream("mytestp") ikinci kez oluştururkenAdlandırılmış boru oluşturma işleminde tüm örnekler meşgul istisnası

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); 

      } 
     } 

durum atılır.

DÜZENLEME:

Yanıt bulundu ve sunucu örneklerinin maksimum sayısı bu varsayılan değeri -1 gibi görünüyor NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);

belirtildiğinde çalışır. Bu başka bir şeye yol açar ama bu önemli bir soru değil: Birisi neden 1 olduğunu ve 1 gibi değil, 1 olduğu zaman 1 olduğunu biliyor? yani maxNumberOfServerInstances değişkene varsayılan atamak NamedPipeServerStream yapıcı iki aşırı yükler vardır

+0

[burada] (https://msdn.microsoft.com/en-us/library/bb355760 (v = vs.110) .aspx # ANCHOR_2) Varsayılan değer, Yine çözüm 1'dir Ediyor Benim de problemimi çözdü, şerefe! Bir cevap olarak göndermeyi düşünürdüm, benden bir oy almış olurdum. –

+0

Sadece "-1" ile ilgili .Net koduna baktım: win32, 1-254 veya 255'in sabit değerlerinin, sistem tarafından izin verilen maksimum değeri ifade etmesine izin veriyor. MaxAllowedServerInstances sabiti üzerinden 255'i -1 (sınırsız) olarak gösteriyoruz. Bu, örn. sonsuz zaman aşımı olarak -1 ile – derape

cevap

0

:

public NamedPipeServerStream(String pipeName) 

ve

public NamedPipeServerStream(String pipeName, PipeDirection direction) 

reference source baktığımızda bu varsayılan olduğunu kanıtlıyor ve -1 değil. Bu, gözlemlediğiniz davranışları açıklar.

Olası çözümler şunlardır:

  1. kullanımı sen sınırı belirlemek ve 1 olarak en fazla 1

  2. aynı değeri geçmesi ve kullanımı sağlayan bir yapıcı dahili sabit NamedPipeServerStream.MaxAllowedServerInstances İşletim sisteminin tahsis edebileceği maksimum tutamaç sayısını sormak için.