2 вопроса по поводу именованных каналов - PullRequest
3 голосов
/ 15 ноября 2009

Привет, у меня есть пара вопросов об использовании именованных каналов.

Во-первых, при попытке настроить конвейерный сервер, я заметил, что если я использую приведенный ниже код ... в конце первого клиентского соединения сервер становится недоступным, ЕСЛИ Я не заверну все это в блоке while (true) , Я сделал это правильно? или каждый сервер должен быть активным только один раз, а затем умереть?

using (NamedPipeServerStream pipeServerStream = new NamedPipeServerStream(pipeName, PipeDirection.In, 1, transmissionMode))
{
    pipeServerStream.WaitForConnection();

    using (StreamReader sr = new StreamReader(pipeServerStream))
    {
        string message = null;

        do
        {
            message = sr.ReadLine();
            OnPipeCommunicationHandler(new IPCData() { Data = message });
        }
        while (message != null);
    }
} 

Во-вторых, мне также пришлось раскрутить сервер в своем собственном потоке - если я этого не сделаю, мое приложение не станет доступным. Это нормально? я сделал это правильно? Я думал, что где-то читал, что namedpipeserverstream создает для себя собственную ветку, но я не вижу, что это так ..

Спасибо!

1 Ответ

3 голосов
/ 15 ноября 2009

Да, для именованных каналов вам нужно создать новый экземпляр сервера, чтобы следующий клиент смог подключиться. Обычно это делается (по крайней мере, в синхронном программировании): вы ждете соединения, затем создаете новый поток для обработки клиента, а исходный поток возвращается к началу цикла для создания нового сервера.

Что касается потоков, хорошо, даже если объект создает поток за сценой (в чем я сомневаюсь), он не обходит стороной тот факт, что написанный вами код является синхронным и, следовательно, в любом случае должен быть в своем собственном потоке ,

...