質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C#

    6565questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • .NET Framework 4.0

    61questions

    Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

C#(.Net Framework 4.5)でサービスの操作を行いたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 359

capoco

score 1

C#(.Net Framework 4.5)ASP.NETを用いて、WindowsフォームアプリケーションWebアプリケーションを作成しております。
その処理の中で、特定のサービスが起動している必要があり、
特定のサービスの起動を行いたく、下記のようなコードを記述しました。

System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController("hogehoge", ".");

if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
{
    try
    {
        sc.Start();
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));
    }
    catch (Exception ex)
    {
        return;
    }
}


そこで以下の不明点が発生したので、ご助言頂きたく、質問させて頂きます。

質問①: タイムアウトについて

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フォームアプリケーション"です。
度重なる回答、お手数おかけ致します…

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • x_x

    2018/01/24 17:29

    そもそも、ASP.NETからWindowsサービスを起動する権限があるでしょうか? サービスはずっと起動したままというものではないのですね?

    キャンセル

  • SurferOnWww

    2018/01/24 23:00

    サービスとはいわゆる Windows Service ですか? 具体的に何をしたいのですか? ASP.NET でワーカープロセスから Windows Service を起動するというのは少なくとも自分は聞いたことがないです。失礼ながら、何か見当違いがあるような気がするのですが・・・ 具体的に何がしたいかを書いていただけると、代案が出てくるかもしれません。

    キャンセル

  • SurferOnWww

    2018/01/25 10:31 編集

    > ASP.NETを用いて、Windowsフォームアプリケーションを作成しております。 ← 質問を書き直された(Web アプリケーション ⇒ Windows フォームアプリケーション)ようですが、まだ変です。ASP.NET とは何かご存知ですか? ASP.NET で Windows フォームアプリは作れないと思いますが? どういうことですか?

    キャンセル

  • SurferOnWww

    2018/01/25 14:39 編集

    どのような Windows Service なのか不明なので可能かどうかわかりませんが、可能であれば Windows Service に頼らず Windows Forms アプリ内で完結できるように、Windows Forms 内で必要な処置をすべて実装するのがよさそうですが? Windows Service で何をしているのかを書いていただけると代案が出てくるかもしれません。

    キャンセル

回答 1

0

回答がつかないようなので答えますが、わたしはプログラムから普通のexeを起動したことはありますが、サービスを起動したことはありません。その前提で

  1. タイムアウトについて
    TimeSpanで10秒を指定しているようですが?
    30秒にしたほうがいいかもしれません。

  2. エラー
    例外を握りつぶしているのでそうなります。
    スローしたければ変更してください。
    エラー内容はex.Messageにあるかもしれません。

    catch (Exception ex)
    {
        throw;
    }
  1. WaitForStatus
    起動待ちをしているだけなので、起動してしまえばタイムアウトを待たずにすぐに抜けます。
    待たなければ起動前に後続の処理をすることになり、「サービスが起動している必要があり」が満たせなくなり、何のために起動しようとしたのかわからなくなってしまいます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 17:21

    3.と書いたのに1.になってますね。直し方がわからないのでいまはこのままで

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6565questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • .NET Framework 4.0

    61questions

    Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。