命名管道创建中的所有实例繁忙异常

问题描述 投票:10回答:1

我有一个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?

c# named-pipes
1个回答
0
投票

NamedPipeServerStream构造函数有两个重载,它们为maxNumberOfServerInstances变量赋值,即:

public NamedPipeServerStream(String pipeName)

public NamedPipeServerStream(String pipeName, PipeDirection direction)

查看reference source证明此默认值为1而不是-1。这解释了您观察到的行为。

可能的解决方案是

  1. 使用允许您指定限制的构造函数,并传递大于1的值
  2. 与1相同,并使用内置常量NamedPipeServerStream.MaxAllowedServerInstances来请求操作系统能够分配的最大句柄数。
© www.soinside.com 2019 - 2024. All rights reserved.