C#(.Net Framework 4.5)ASP.NETを用いて、WindowsフォームアプリケーションWebアプリケーションを作成しております。
その処理の中で、特定のサービスが起動している必要があり、
特定のサービスの起動を行いたく、下記のようなコードを記述しました。
C#
1System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController("hogehoge", "."); 2 3if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) 4{ 5 try 6 { 7 sc.Start(); 8 sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, 0, 10)); 9 } 10 catch (Exception ex) 11 { 12 return; 13 } 14}
そこで以下の不明点が発生したので、ご助言頂きたく、質問させて頂きます。
質問①: タイムアウトについて
Startメソッドにてサービスの起動を行っておりますが、
ユーザが手動でサービスの開始をする場合、
規定では30秒(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeoutの値)経過すると
自動で起動エラー(タイムアウト)になるのですが、本メソッドも同様に上記レジストリの値分待機しますでしょうか。
質問②: エラー内容について
Startメソッドが失敗し、Runnningステータスにできなかった場合(e.g.: タイムアウト、管理者権限不足等)、
例外等がスローされずに後続の処理が実行されます。
例外がスローされないのは別に良いのですが、"何故起動に失敗したのか"を知る術はありますでしょうか。
質問③: WaitForStatusについて
全て同一スレッドで実行しているのですが、Startメソッド実行時に処理がそこで停止しているようです。
C#でのサービス起動処理の仕方を検索した際、参考にしたサイトではWaitForStatusをコールしていたので
そのように作りましたが、本メソッドをコールする必要はあるのでしょうか。
- Startメソッドで開始を試みる(ここで処理待機)⇒失敗する⇒WaitForStatusで処理待機(Startメソッドは既に失敗しているのでRunになることはないので無駄な待機となる)
となってしまう気がするのですが、間違っておりますでしょうか。
五月雨で申し訳ございませんが、ご回答頂けますでしょうか。
宜しくお願い致します。
◆追記①
x_x様、SurferOnWww様、ご回答頂きありがとうございます。
申し訳ございません、根本的に書き間違いをしており、Webアプリケーションではなくフォームアプリケーションです。
なのでIIS等のWebサーバは関係しておらず、自身の端末上のサービスを自身が起動したい、だけとなります。
サービスとはいわゆる Windows Service ですか?
はい、Windows Serviceです。
具体的に何をしたいのですか?
第三者の作成したサービスがあり、そのサービスはマシン起動時に自動で立ち上がるように
クライアント端末にインストールされております。
そして、私の作成したフォームアプリケーションでは、上記のサービスが立ち上がっていることが前提に
処理を組んでおります。
しかし、たまにマシン起動時にサービスが立ち上がらないケースがあるようで、
その場合はフォームアプリケーション起動時に、"特定のサービスが立ち上がっていない場合に起動する"処理を追加したいです。
そこで前述したソースを書いてみたのですが、不明点がいくつかあがり、
本質問を行わせて頂きました。
拙い文章で申し訳ございませんが、必要な情報は足りてますでしょうか。
◆追記②
SurferOnWww様、ご回答頂きありがとうございます。
申し訳ございません、ASP.NETについてさして気にせず、普段使っているからという理由で書いてしまいました。
ASP.NETはWebアプリケーションのフレームワークでした、、
正確には".Net Framework 4.5を用いて作っているWindowsフォームアプリケーション"です。
度重なる回答、お手数おかけ致します…