所有实例在创建命名管道时出现繁忙异常
本文关键字:异常 管道 实例 创建 | 更新日期: 2023-09-27 18:21:59
我有一个windows服务,它通过命名管道与gui应用程序通信。因此,我有一个线程在运行,等待应用程序连接,如果我做一次,它运行得很好。但是,如果线程正在创建命名管道流服务器的新实例,那么已经建立的连接就会中断,我会得到所有实例繁忙的异常。抛出异常的代码片段如下:
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);
}
}
第二次创建新的管道服务器流NamedPipeServerStream ps = new NamedPipeServerStream("mytestp")
时引发异常。
编辑:
我找到了答案,当指定了服务器实例的最大数量时,它就起作用了NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);
默认值似乎是-1。这引出了另一个但并不那么重要的问题:有人知道为什么当它表现得像蜜蜂1时,它是-1而不是1?
NamedPipeServerStream
构造函数有两个重载,它们为maxNumberOfServerInstances
变量分配默认值,即:
public NamedPipeServerStream(String pipeName)
和
public NamedPipeServerStream(String pipeName, PipeDirection direction)
查看参考源可以证明此默认值是1而不是-1。这解释了您观察到的行为。
可能的解决方案有:
使用一个允许您指定限制的构造函数,并传递一个大于1 的值
与1相同,并使用内置常量
NamedPipeServerStream.MaxAllowedServerInstances
来请求操作系统能够分配的最大句柄数。