IPC windows service windows формы - PullRequest
1 голос
/ 06 июня 2009

У меня проблема с IPC. Я создал в службе Windows NamedPipeServer:

serverPipe = new NamedPipeServerStream(Constants.PIPE_NAME, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
Thread thread = new Thread(new ThreadStart(pipeWork));
thread.Start();

где pipeWork

private static void pipeWork()
{
    try
    {
        byte[] buffer = new byte[1024];
        while (true)
         {
            if (!serverPipe.IsConnected)
                serverPipe.WaitForConnection();
            int nr = serverPipe.Read(buffer, 0, buffer.Length);
            String str=Encoding.Default.GetString(buffer);

        …
        }
    }
    catch (Exception ex)
    {

    }
}

и в Windows формы у меня есть клиент

clientPipe = new NamedPipeClientStream(".", PhotoServiceClassLibrary.Constants.PIPE_NAME, PipeDirection.InOut,PipeOptions.Asynchronous);
                clientPipe.Connect();
                clientPipe.ReadMode = PipeTransmissionMode.Message;

pipeThread=new Thread(new ThreadStart(pipeWork));
            pipeThread.Start();

, где pipeWork -

private void pipeWork()
{
    try
    {
        while (true)
        {
            using (StreamReader sr = new StreamReader(clientPipe))
            {
                string message;

                while ((message = sr.ReadLine()) != null)
                {

                    …

                }
            }
        }
    }
    catch (Exception ex)
    {

    }
}

Я хочу, чтобы служба начала действие, чтобы отключить ContextMenuStrip из форм Windows, для этого служба записывает сообщение в StreamWriter sw:

        StreamWriter write = null;
        write = new StreamWriter(serverPipe);

        if (serverPipe.IsConnected)
        {
            write.Write(message);
            write.Flush();
        }

Код правильный, потому что я создал для тестирования другие формы Windows, которые реализуют те же вещи, что и служба Windows, и связь между ними. Windows форм труба сервер -> Windows форм труба клиент работает хорошо. Проблема в том, что форма Windows - клиентский канал не получает сообщение от службы Windows - серверный канал.

Я знаю, что WCF может быть лучшей идеей, но я хочу понять, почему не работает на низкоуровневом IPC. Зачем? Я видел очень странное поведение. Мой сервис взаимодействует 2 раза с окнами форм: 1. Мой сервис предназначен для скачивания некоторых фотографий. Когда он начинает загрузку, он отправляет сообщение в формы Windows, чтобы сообщить ему об этом. 2. Когда я прекращаю службу, он отправляет сообщение в формы Windows, и он также останавливается. Я только что обнаружил, что оба сообщения прибывают в агент Windows только после остановки службы. Может кто-нибудь объяснить, почему?

Ответы [ 2 ]

1 голос
/ 07 июня 2009

Надеюсь, это не ваш настоящий код. Хорошо, что у вас есть блоки try / catch вокруг кода ваших обработчиков ThreadStart (в противном случае исключение может просто удалить поток). Однако, если вы не регистрируете исключение в блоке catch, то это действительно так же плохо.

У вас есть загадка (сервер не получает сообщения), и вы скрываете информацию (произошло исключение). Если вы не скрывали информацию, возможно, у вас есть ответ на вопрос (сервер не получает сообщение из-за возникновения исключения).

0 голосов
/ 19 августа 2013

Я пытаюсь реализовать то же самое.

Я заметил, что вы передаете перечисление PipeTransmissionMode.Message в конструкторе NamedPipeServerStream (serverPipe). Это означает, что поток будет содержать строки.

Но в pipeWork вы читаете их как массив байтов.

Посмотрите на пример в этой статье на MSDN: http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx

...