我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
NamedPipeServerStream ps = new NamedPipeServerStream("mytestp")第二次创建新管道服务器流时抛出异常.
编辑:
我找到了答案,它在指定最大服务器实例数时起作用
NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);
此默认值似乎为-1.这导致了另一个但不是那么重要的问题:有人知道为什么它是-1而不是1当它表现得像是1?
构造函数有两个重载NamedPipeServerStream为变量分配默认值maxNumberOfServerInstances,即:
public NamedPipeServerStream(String pipeName)
Run Code Online (Sandbox Code Playgroud)
和
public NamedPipeServerStream(String pipeName, PipeDirection direction)
Run Code Online (Sandbox Code Playgroud)
查看参考源证明这个默认值是1而不是-1。这解释了您观察到的行为。
可能的解决方案是:
使用允许您指定限制并传递大于 1 的值的构造函数
与 1 相同,并使用内置常量NamedPipeServerStream.MaxAllowedServerInstances来询问操作系统能够分配的最大句柄数。