【问题标题】:IPC windows service windows formsIPC windows 服务窗口窗体
【发布时间】: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


    【解决方案1】:

    我希望这不是您的真实代码。最好在 ThreadStart 处理程序的代码周围有 try/catch 块(否则异常只会悄悄地删除线程)。但是,如果您没有在 catch 块中记录异常,那么它确实同样糟糕。

    您有一个谜团(服务器未收到消息),并且您正在隐藏信息(发生异常)。如果您没有隐藏信息,那么您可能已经找到了谜团的答案(服务器没有收到消息,因为发生了异常)。

    【讨论】:

    • 不,这不是我的真实代码。我真正的代码是:try{ [...] } catch(exception ex) { throw ex; }
    • 而且,不,我没有任何错误......我应该对 Windows 服务通过命名管道与 Windows 窗体进行通信做什么?
    • 如果你只是要再次抛出异常,请执行“throw;”不是“扔前;”。更好的是,如果你只是要重新扔它,那就不要抓住它。最好,抓住它并记录下来。
    • 另外,我的建议是远离这种低级机制,而改用 WCF。它支持命名管道和许多其他形式的绑定,并且它们支持二进制序列化,因此没有 SOAP 或 XML 的开销。
    【解决方案2】:

    我正在尝试实现同样的事情。

    我注意到您在 NamedPipeServerStream (serverPipe) 构造函数中传递了 PipeTransmissionMode.Message 枚举。这意味着流将包含字符串。

    但在 pipeWork 中,您将它们作为字节数组读取。

    查看 MSDN 上这篇文章中的示例: http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 2012-05-31
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多