2013-10-17 17 views
7

コンソールアプリケーションをWindowsサービスに変換しようとしています。私はクラスのメソッド呼び出しのonstartメソッドを持ってしようとしていますが、私はそれを働かせるように見えることができます。私はこれを正しくやっているのか分からない。どこで私はコメントからサービスC#コンソールアプリケーションをサービスに変換する

protected override void OnStart(string[] args) 
{ 
    EventLog.WriteEntry("my service started"); 
    Debugger.Launch(); 
    Program pgrm = new Program(); 
    pgrm.Run(); 
} 

にクラス情報を入れてください:

namespace MyService { 
static class serviceProgram { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() { 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] { 
    new Service1() 
    }; 
    ServiceBase.Run(ServicesToRun); 
    } 
} 
} 
+0

コンソールアプリケーションからWindowsアプリケーションにプロジェクトタイプを変更しましたか? 'ServiceBase.Run'を呼び出していますか? –

+0

はいソリューションでWindowsサービスとして新しいプロジェクトを作成しました。 – user2892443

+0

名前空間MyService { static class serviceProgram { ///

///アプリケーションのメインエントリポイント。 ///静的な無効メイン(){ ServiceBase [] ServicesToRun。 ServicesToRun =新しいServiceBase [] {新しいサービス1() }。 ServiceBase.Run(ServicesToRun); }} } – user2892443

答えて

8

WindowsサービスのMSDN documentationは本当に良いですし、あなたが始めるために必要なすべてを持っています。

あなたが抱えている問題は、それが唯一それが開始する準備ができて、この方法は、速やかに返却しなければならないので、サービスを設定するために使用されることになっています、なぜならあなたのOnStart実装です。通常は、コードの大部分を別のスレッドやタイマーで実行します。確認のためOnStartのページを参照してください。

編集: あなたの窓のサービスが何をするかを知ることがなければ、それはそれを実装する方法を教えてくれますがのサービスが実行されている間、あなたは10秒ごとにメソッドを実行したいとしましょうのは難しい:

public partial class Service1 : ServiceBase 
{ 
    private System.Timers.Timer _timer; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
#if DEBUG 
     System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration 
#endif 

     _timer = new System.Timers.Timer(10 * 1000); //10 seconds 
     _timer.Elapsed += TimerOnElapsed; 
     _timer.Start(); 
    } 

    private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) 
    { 
     // Call to run off to a database or do some processing 
    } 

    protected override void OnStop() 
    { 
     _timer.Stop(); 
     _timer.Elapsed -= TimerOnElapsed; 
    } 
} 

ここでは、OnStartメソッドはタイマーの設定直後に戻り、TimerOnElapsedはワーカースレッド上で実行されます。また、System.Diagnostics.Debugger.Launch();への呼び出しを追加しました。これにより、デバッグが簡単になります。

あなたには、いくつかの他の要件を持っている場合は、あなたの質問を編集したり、コメントを投稿してください。

+0

これは私の問題です。私はOnStartの実装に何を入れるべきかわかりません。別のスレッドやタイマーに大量のコードを置くのはどういう意味ですか? OnStartから呼び出されない場合、プロセスはコードを実行する方法をどのように知っていますか。忍耐のために事前にありがとう、サービスは私に全く新しいです – user2892443

+1

@ user2892443私の答えを例で編集しました。 – ChrisO

2

自身に最大の恩恵を行うと、あなたのサービスを作成するためにtopshelf http://topshelf-project.com/を使用します。私が見たことはそれほど簡単ではありません。彼らのドキュメンテーションは控えめであり、配備は簡単ではありません。 c:/ service/service.exeへのパスをインストールします。

+1

このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](レビュー/低品質の投稿/ 18747979) – ViRuSTriNiTy

関連する問題