2013-10-08 3 views
2

Используя код из этого ответа - Async two-way communication with Windows Named Pipes (.Net) - Я нахожу, что максимальное количество соединений/клиентов в любой момент времени 10.Дуплекс именованные каналы - максимальное количество клиентов на одной трубе

В неочищенном примере ниже (это использует несколько потоков - то же самое происходит, если используются несколько процессов) клиенты с 1 по 10 запускаются и запускаются как обычно. Однако клиенты 11 и 12 блокируются, когда вызывается «ProcessData», в конечном итоге бросая исключение TimeoutException.

public static void Start() 
    { 
     // Start Server 
     new Thread(new ThreadStart(Server.MainRun)).Start(); 

     // Start Clients 
     for (int i = 1; i <= 12; i++) 
     { 
      Thread.Sleep(500); 
      Client c = new Client(i.ToString()); 
      new Thread(new ThreadStart(c.Run)).Start(); 
     } 
    } 

    // Create a contract that can be used as a callback 
    public interface IMyCallbackService 
    { 
     [OperationContract(IsOneWay = true)] 
     void NotifyClient(); 
    } 

    // Define your service contract and specify the callback contract 
    [ServiceContract(CallbackContract = typeof(IMyCallbackService))] 
    public interface ISimpleService 
    { 
     [OperationContract] 
     string ProcessData(); 
    } 

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class SimpleService : ISimpleService 
    { 
     public string ProcessData() 
     { 
      // Get a handle to the call back channel 
      var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>(); 

      callback.NotifyClient(); 
      return DateTime.Now.ToString(); 
     } 
    } 

    class Server 
    { 
     public static void MainRun() 
     { 
      // Create a service host with an named pipe endpoint 
      using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost"))) 
      { 
       host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService"); 
       host.Open(); 

       Console.WriteLine("Simple Service Running..."); 
       Console.ReadLine(); 

       host.Close(); 
      } 
     } 
    } 

    class Client : IMyCallbackService 
    { 
     string _id; 

     public Client(string ID) 
     { 
      _id = ID; 
     } 

     public void Run() 
     { 
      Console.WriteLine("Starting client : " + _id); 
      // Consume the service 
      var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService")); 
      var proxy = factory.CreateChannel(); 

      Console.WriteLine(proxy.ProcessData()); 

      Console.WriteLine("Client finished : " + _id); 
     } 

     public void NotifyClient() 
     { 
      Console.WriteLine("Notification from Server"); 
     } 
    } 

Если клиент закрывает канал по завершении (factory.Close()), то все клиенты смогут запустить.

Я понимаю этот вопрос - Number of Clients that can connect to a Named Pipe - очень похоже, но предполагает, что нет предела.

Это говорит о том, что ограничение ограничено 10 машинами Windows XP и 2000 - http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx - за исключением того, что это происходит на компьютере с Windows 8 и сервером Windows 2008.

Есть ли способ изменить этот предел? Мне что-то не хватает?

ответ

2

Google привел меня сюда через год после того, как этот вопрос был задан. Я полагаю, что я могу опубликовать сообщение, чтобы помочь кому-то еще, кто попадает сюда. I думаю Я знаю, почему предел 10.

Ты знаешь о NetNamedPipeBinding.MaxConnections недвижимости?

Получает или задает максимальное количество подключений, входящих и исходящих, которые разрешены конечным точкам, настроенным с привязкой именованного канала. ... Максимальное количество именованных соединений каналов, разрешенных с помощью этой привязки. Значение по умолчанию равно 10.

0

«гость» правильно и an old blog сообщений от MSDN подкрепляет это как по-прежнему применимым в текущих .net выпусков.

Он также предполагает, что значение по умолчанию было определено для использования с средами разработки и «малыми» развертываниями.

Из других настроек (например, размер буфера) Я бы предположил, что ожидалось бы> 8 кб на одно подключение.

Я еще не нашел никакой информации о том, какие проблемы могут возникнуть, если значение настроено для больших значений (например,> 1000): API отображается настроенным для более коротких, более интенсивных запросов, и я подозреваю, что для больших значений это может быть просто (не столько для памяти, сколько для внутренней реализации) -

Я бы приветствовал доказательства в любом случае по производительности/проблемам (или успеху) со значительным количеством клиентов, подключенных к конечной точке.

Смежные вопросы