所有实例在创建命名管道时出现繁忙异常

本文关键字:异常 管道 实例 创建 | 更新日期: 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 的值

  2. 与1相同,并使用内置常量NamedPipeServerStream.MaxAllowedServerInstances来请求操作系统能够分配的最大句柄数。