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();

サービスホストは、イベントを2回以上開こうとしないでください。スターターコードは、サービスアプリケーションを開始する前に、イベントが作成されていること(および適切なセキュリティ権限があること)を確認する必要があります。

于 2012-02-10T08:05:51.867 に答える