Все экземпляры занятого исключения при создании именованного канала

У меня есть служба 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") во второй раз.

EDIT:

Я нашел ответ, и он работает, когда указано максимальное количество экземпляров сервера NamedPipeServerStream ps = new NamedPipeServerStream("mytestp",PipeDirection.Out,10);

Значение по умолчанию для этого значения равно -1. Что приводит к другому, но не к важному вопросу: кто-то знает, почему это -1, а не 1, когда он ведет себя как beeing 1?

Ответ 1

Существует две перегрузки конструктора NamedPipeServerStream, которые присваивают значение по умолчанию переменной maxNumberOfServerInstances, а именно:

public NamedPipeServerStream(String pipeName)

и

public NamedPipeServerStream(String pipeName, PipeDirection direction)

Глядя на справочный источник, доказывает, что это значение по умолчанию 1, а не -1. Это объясняет поведение, которое вы наблюдали.

Возможные решения:

  • используйте конструктор, который позволяет вам указать предел и передать значение больше 1

  • то же, что и 1, и использовать встроенную константу NamedPipeServerStream.MaxAllowedServerInstances для запроса максимального количества дескрипторов, которые может выделить операционная система.