Сервер именованных каналов с несколькими клиентами (C #) - PullRequest
0 голосов
/ 13 марта 2019

У меня есть именованный сервер, написанный на C #.Суть реализации:

    void BeginWaitForNextConnection()
    {
        var pipe = new NamedPipeServerStream(
            PipeName,
            PipeDirection.InOut,
            NamedPipeServerStream.MaxAllowedServerInstances,
            PipeTransmissionMode.Byte,
            PipeOptions.Asynchronous,
            0, // default in buffer size
            0, // default out buffer size
            CreateAllAccessPipeSecurity());

        pipe.BeginWaitForConnection(ClientRequestHandler, pipe);
    }

    void ClientRequestHandler(IAsyncResult ar)
    {
        // Clean up the async call state.
        NamedPipeServerStream pipe = (NamedPipeServerStream)ar.AsyncState;

        pipe.EndWaitForConnection(ar);

        // If we've been asked to shut down, go away.
        if (_stopping)
        {
            pipe.Close();
            return;
        }

        // Set up for the next caller.
        BeginWaitForNextConnection();

        // Handle this client's I/O. This code wraps the pipe stream in BinaryReader and BinaryWriter objects and handles communication with the client.
        HandlePipeClient(pipe);
    }

Это прекрасно работает - пока несколько экземпляров не попытаются соединиться в быстрой последовательности.В моем клиентском коде указан 10-секундный тайм-аут, поэтому я ожидаю, что даже если 10 экземпляров попытаются подключиться в одну и ту же секунду, все они будут успешными, потому что для этого кода не потребуется 10 секунд, чтобы циклически пройти 10 итераций ClientRequestHandler обратные вызовы в BeginWaitForNextConnection - но это действительно то, что я вижу.Для случайного одноразового соединения этот код очень надежен, но если я получаю частые запросы, возможно, если между обратным вызовом и следующим * 1006 поступит запрос на соединение, это соединение не будет поставлено в очередь ибыть немедленно поднятым - это просто теряется.

Это ожидается ??Каково идиоматически правильное решение?Должен ли я просто наматывать целую кучу потоков , ожидающих подключения сразу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...