他のアプリケーションと連携して動作するWindowsサービスを作成しています。これらのアプリケーションは、サービスVIA Remotingとの通信を開始します。接続が確立されると、サービスが停止された場合にすぐに通信を停止するアプリケーションにしたいと考えています。意味私は、通信がもはや有効ではないIpcConnectionを使用しようとしていたために、Timerが経過するか、例外が発生するのを待っていません。外部プロセス(サービス)に対してWaitForExit()を実行する方法
これは、サービスがサービスとしてではなく対話的に実行されている場合にすべて機能します。それがサービスとして実行されると、例外が発生します。サービスは、サービスとして実行されるか、対話的に実行されるかに関係なく、管理者として実行されます。他のアプリケーションを管理者として実行すると、期待通りに機能します。残念ながら、このアプリケーションを管理者として実行することは、本番環境では選択肢にはなりません。
私は、例外の原因を絞り込んだ。
var serverProc = Process.GetProcessById(_remote.ProcessId);
serverProc.WaitForExit();
serverProc
成功しているが、WaitForExit
失敗します。
System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.WaitForExit(Int32 milliseconds)
私はTimer
でこのコードを置き換えることができますが、私は、この現在の技術は働くだろう期待していました。
私は何か仕事をしていますが、例外を避けて同様のコードを使用するために何かできますか?
これは完全に正常です:
は作品は、あなたがあなたのアプリケーションを作るために、この質問を使用することができると仮定すると、常にその許可が必要です。あなたは実用的にならなければならないでしょう、プロセスクラスの仕方を変えることはできません。そして、確かにさようならと言ってサービスから始める必要があるので、難しい方法を見つけ出す必要はありません。ハードクラッシュで死んでもまだ動作しません。例外的に何かが発生した場合、例外を生成する必要があります。 –