У меня проблема с 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 только после остановки службы. Может кто-нибудь объяснить, почему?