使用此答案中的代码 - 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 - 非常相似,但暗示没有下限。
这表明Windows XP和2000计算机上的限制为10 - http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx - 除了这种情况发生在Windows 8计算机和Windows 2008服务器上。
有没有办法改变这个限制?我错过了一些明显的东西吗?
答案 0 :(得分:2)
您是否知道NetNamedPipeBinding.MaxConnections属性?
获取或设置允许使用命名管道绑定配置的端点的最大连接数(入站和出站)。 ...此绑定允许的最大命名管道连接数。 默认值为10.
答案 1 :(得分:0)
&#34;旅客&#34;是正确的,来自MSDN的an old blog帖子证实这仍然适用于当前的.net版本。
它还建议定义默认设置以用于开发环境和&#34; small&#34;部署。
从其他设置(例如,缓冲区大小),我建议预期每个连接开销大于8kb。
我还没有找到任何关于如果将值调整为较大值(例如,> 1000)可能出现什么问题的信息:API似乎针对较短的,突发性的请求进行了调整,我怀疑它的值很大,可能只是效率低下(不是内存而是内部实现) -
我欢迎使用大量客户端附加到端点的性能/问题(或成功)的证据。