10

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

4

1 回答 1

0

构造函数有两个重载为变量NamedPipeServerStream分配默认maxNumberOfServerInstances值,即:

public NamedPipeServerStream(String pipeName)

public NamedPipeServerStream(String pipeName, PipeDirection direction)

查看参考源证明这个默认值是1而不是 -1。这解释了您观察到的行为。

可能的解决方案是:

  1. 使用允许您指定限制并传递大于 1 的值的构造函数

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

于 2017-12-18T08:54:57.293 回答