【发布时间】:2009-06-06 16:27:47
【问题描述】:
我遇到了 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)
{
}
}
我希望当服务开始执行从 Windows 窗体禁用 ContextMenuStrip 的操作时,该服务会将消息写入 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 上工作。为什么?我看到了一个非常奇怪的行为。我的服务与 Windows 窗体交互 2 次: 1.我的服务是为下载一些照片而设计的。当他开始下载时,他会向 Windows 窗体发送一条消息来通知他。 2.当我停止服务时,他向 Windows 窗体发送一条消息,他也停止了。 我刚刚发现这两条消息只有在服务停止后才会到达 Windows 代理。谁能解释一下原因?
【问题讨论】:
标签: winforms windows-services ipc