Используя код из этого ответа - 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.
Есть ли способ изменить этот предел? Мне что-то не хватает?