2013-07-10 29 views
10

Tôi có dịch vụ cửa sổ liên lạc với ứng dụng gui qua các đường ống có tên. Do đó, tôi có một chuỗi đang chạy chờ ứng dụng kết nối đang chạy tốt nếu tôi thực hiện một lần. Nhưng nếu thread là tạo ra một trường hợp mới của máy chủ dòng ống được đặt tên, kết nối đã được thiết lập bị hỏng và tôi nhận được tất cả các trường hợp ngoại lệ bận. Đoạn mã nơi ngoại lệ được ném là:Tất cả các trường hợp ngoại lệ bận trên việc tạo ống có tên

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

      } 
     } 

Trường hợp ngoại lệ được tạo khi tạo luồng máy chủ ống mới NamedPipeServerStream ps = new NamedPipeServerStream("mytestp") lần thứ hai.

EDIT:

Tôi tìm thấy câu trả lời và nó hoạt động khi số lượng tối đa các trường hợp máy chủ được quy định NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);

Giá trị mặc định cho điều này có vẻ là -1. Dẫn đến câu hỏi khác nhưng không phải là câu hỏi quan trọng: Ai đó biết tại sao nó là -1 và không 1 khi nó hoạt động như beeing 1?

+0

Nói [tại đây] (https://msdn.microsoft.com/en-us/library/bb355760 (v = vs.110) .aspx # Anchor_2) giá trị mặc định là 1. Tuy nhiên, giải pháp của bạn cũng đã giải quyết được vấn đề của tôi, chúc mừng! Tôi sẽ xem xét việc gửi nó như là một câu trả lời, tôi sẽ nhận được một phiếu bầu từ tôi. –

+0

Tôi chỉ có một cái nhìn vào mã .Net liên quan đến "-1" nó nói: win32 cho phép giá trị cố định 1-254 hoặc 255 để có nghĩa là tối đa cho phép bởi hệ thống. Chúng tôi phơi bày 255 là -1 (không giới hạn) thông qua hằng số MaxAllowedServerInstances. Điều này nhất quán, ví dụ: với -1 là thời gian chờ vô hạn, v.v. – derape

Trả lời

0

Có hai quá tải của các nhà xây dựng NamedPipeServerStream rằng gán mặc định cho biến maxNumberOfServerInstances, cụ thể là:

public NamedPipeServerStream(String pipeName) 

public NamedPipeServerStream(String pipeName, PipeDirection direction) 

Nhìn vào reference source chứng minh rằng, mặc định là và không phải -1. Điều này giải thích hành vi bạn đã quan sát.

giải pháp có thể là:

  1. sử dụng một constructor cho phép bạn chỉ định giới hạn, và vượt qua một giá trị lớn hơn 1

  2. giống như 1, và sử dụng built-in liên tục NamedPipeServerStream.MaxAllowedServerInstances để yêu cầu số lượng xử lý tối đa mà hệ điều hành có thể phân bổ.

Các vấn đề liên quan