0

我有一个由控制台应用程序托管的 WCF 服务。客户端通过命名管道连接到服务。并且控制台仅在客户端需要时执行,并且在客户端完成后控制台被杀死。

下面是启动和调用服务的代码:

Process hostProcess = Process.Start(info);

//make sure the service is up and running
//todo: find out a better way to check if the service is up and running.
Thread.Sleep(200);

EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/test");
NetNamedPipeBinding binding = new NetNamedPipeBinding();
IHostedService service=hannelFactory<IHostedService>.CreateChannel(binding, endpointAddress);
service.Run();

hostProcess.Kill();

我正在使用 Thread.Sleep 来确保服务已启动并正在运行,但这绝对不是正确的方法。

那么,如何确定托管在控制台应用程序中的 WCF 服务是否已启动并正在运行?

后续问题,我如何在不使用 Thread.Sleep 的情况下等待事件被触发?

        private static EventWaitHandle GetEventWaitHandle()
    {
        try
        {
            EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(string.Format(serviceStartedEventName, taskIndex));
            return eventWaitHandle;
        }
        catch (Exception)
        {
            //if we do not sleep here, it may cause a stack over flow exceptoin.
            Thread.Sleep(10);
            return GetEventWaitHandle();
        }
    }
4

1 回答 1

2

您可以让控制台应用程序在其 ServiceHost 已打开时发出事件信号。


更新

您的起始代码应该在您的 WaitHandle 实例上调用 WaitOne:

EventWaitHandle evtServiceStarted = new EventWaitHandle(...);

Process hostProcess = Process.Start(info); 

//make sure the service is up and running
evtServiceStarted.WaitOne();

// Go ahead and call your service...

您的服务主机应该在 WaitHandle 实例上调用 Set 指向相同的命名事件对象:

EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(...);
// Set up the service host and call Open() on it

//... when its all done
eventWaitHandle.Set();

您的服务主机不应多次尝试打开事件 - 您的启动代码需要确保在启动服务应用程序之前创建事件(并具有正确的安全权限)。

于 2012-02-10T08:05:51.867 回答