3

我正在创建一个启动多个从属进程的 Windows 服务。在每个从属进程中,我开始在命名管道上侦听来自主进程的消息。

我目前的情况是,在从属完全启动并开始侦听命名管道之前,主进程通过命名管道调用从属。

    ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
    processStartInfo.Arguments = Address 

    Process process = new Process();
    process.StartInfo = processStartInfo;

    process.Start();

    base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    base.Endpoint.Address = Address;

    base.Channel.RemoteMethod();

如果我这样做,频道就会进入CommunicationState.Faulted,并且频道上的任何后续调用也会失败。

我该怎么做才能从主进程验证从进程开始侦听?或者我怎样才能CommunicationState.Faulted从重试远程呼叫中恢复?

4

3 回答 3

1

从故障状态恢复的唯一方法是通过重新构建实例并调用 Open() 方法来重新初始化 WCF 客户端。

一般来说,在调用服务之前,我总是检查状态属性,如果它没有打开,我会尝试重新初始化它,如上所述。如果失败,则服务器有问题。(在我的情况下,状态由于不活动而出错,因此初始化通常会成功)

于 2009-07-03T07:05:14.183 回答
0

您可以附加到主机上的“ServiceFaulted”事件,并使用它来执行错误处理。根据文档,正确的操作是中止主机。然后您可以尝试重新初始化它,但如果系统关闭,这可能是徒劳的。

于 2009-07-03T07:08:21.997 回答
0

也许您可以实现基于“会话”的服务。因此客户端打开 WCF 通道并进行调用以打开会话(例如“打开”调用)。这会让你的主机知道从机正在监听。

您可能想研究 WCF 的回调机制,以便通过从它初始化后发出的“打开”调用的回调提供与从属设备的远程通信。

Alex Drenea 说您要创建一个新实例是正确的。我建议查看 WCF 中的 ChannelFactory 类来创建代理。您可以将其与一些 try catch 类型的行为一起使用来处理从站的初始启动。您可能还想在从属进程启动代码中放置一个 System.Diagnostics.Debugger.Break() ,因为调试器可能不会附加,因此您在从属进程中看不到异常。

请问您是否真的需要进程隔离,或者使用同步和线程是否足以完成您的任务?

于 2009-07-03T08:47:28.270 回答