2012-03-16 4 views
3

私は簡単なWindowsサービスアプリケーションを作成することができました。ちょうどフレーム。私はまだ混乱しています。実際に何かをするためにWindowsサービスのコードをどこに置くべきですか?私は別のプログラムを持っています。私はここに/呼び出し/組み込みたいと思っています。 どこにプログラムを置くべきですか?どこから始めたらいいですか?C#windows service program

public partial class MyNewService : ServiceBase 
{ 
    public MyNewService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "MySource", "MyNewLog"); 
     } 
     eventLog1.Source = "MySource"; 
     eventLog1.Log = "MyNewLog"; 
    } 




    static void Main() 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 
     // Change the following line to match. 
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
    } 
} 

}

答えて

3

あなたはOnStart方法(および他の類似のもの、などOnStopOnShutdown、など)をオーバーライドする必要があります。

この場合、OnStartメソッドがブロックされないか、実行に非常に時間がかかることを確認してください。これは、実際のサービスロジックを独自のスレッドで実行することを意味します。必要に応じて

0
はあなた MyNewService上で次のメソッドをオーバーライド

protected virtual void OnContinue(); 
protected virtual void OnCustomCommand(int command); 
protected virtual void OnPause(); 
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus); 
protected virtual void OnSessionChange(SessionChangeDescription changeDescription); 
protected virtual void OnShutdown(); 
protected virtual void OnStart(string[] args); 
0

あなたはOn____方法を(あなたがそれらを上書きすることができますので、彼らは仮想です)を使用して送信される各種イベントに反応します。

具体的に、最も簡単な場合には:this walkthrough

protected override void OnStart(string[] args) 
{ 
    //Do stuff here 
} 
1

、それはあなたがOnStart()をオーバーライドすると言います。

Windowsサービスプログラムテンプレートの使用に拘束されていない場合は、check out this libraryを使用すると、プログラミングサービスをはるかに簡単にすることができます。現時点では、構築したサービス実行ファイルを直接実行することはできません。インストールできるのはインストールのみです。 Hoytsoftのライブラリがインストールされ、通常のWindowsフォームアプリケーションと同様に自動的に実行されます。

0

OnStart()機能を無効にする必要があります。コンストラクタを空のままにすることをお勧めしますので、コンストラクタ内のすべてのコードを同じ関数に移動することをお勧めします(これはサービスの場合だけでなく、これは別の話です)。最初は、あなたが望む仕事をしている1つ以上のスレッドを回転させます。 OnStart()は可能な限り戻る必要があることを忘れないでください。作業スレッドを正常にブロックするには、おそらくOnStop()関数にロジックを実装する必要があります。

0

これまで説明したように、コードをOnStart()に入れないでください。どうして?あなたのOnStart()メソッドがすぐに返ってこない場合、サービスマネージャはあなたのサービスに応答しないとフラグを立て、あなたをシャットダウンします。

私は自分のコードをStart()メソッドに入れ、OnStart()はすべてStart()を呼び出します。これと同じように:

protected override void OnStart(string[] args) 
    { 
     Start(); 
    } 

    public static void Start() 
    { 
     ... do stuff 
    } 

また、サービスを開始するには、あなたのコードは、コンパイルやデバッグモードであるかどうかに応じて異なる振る舞いをしようとしていることに注意してください。

System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

私は確かにそれが正しく動作し、私は実行またはデバッグするために、前後にコードを変更するために覚えておく必要がないようにするためにこれを行います。

 if(Debugger.IsAttached) 
      Service.Start(); 
     else 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service() 
      }; 

      ServiceBase.Run(ServicesToRun); 
     } 
0

ビジネスロジックを呼び出すためにOnStart()メソッドをオーバーライドします。前述のように、別のスレッドを作成して機能を持たせるか、Timerでイベントハンドラを使用して(スレッドを再度使用して)ビジネスロジックを呼び出すことができます。サービスはOSに制御を戻さなければならず、したがって、Onstartメソッドは、サービスが実行されている間にコントロールをウィンドウに戻す必要があります。

電源シャットダウン、オンストップイベントを制御、一時停止、再開するには、これらのメソッドをオーバーライドしてロジックを書き込む必要があります。

関連する問題