4

Windows サービス プロジェクトの次のコードがあります。私はそれを正常に構築してインストールしました。起動すると、イベント ログでイベントが開始されます。しかし、「In Onstart」のイベントが発生しない理由は何ですか?

namespace ADServiceCarlos
{
    public partial class ADServiceCarlos : ServiceBase
    {           
        public ADServiceCarlos()
        {
            InitializeComponent();
            this.AutoLog = true;

            if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
            {         
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource","MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
        }

        protected override void OnStop()
        {
        }
    }
}
4

2 に答える 2

4

OK、これで問題が解決するかもしれません。すべてのコードを見ることができなければ正確に伝えるのは難しいですが、これを読んでください- より具体的には「注意」の部分です。

コンストラクターを使用して、OnStart にある必要がある処理を実行しないでください。OnStart を使用して、サービスのすべての初期化を処理します。コンストラクターは、サービスの実行時ではなく、アプリケーションの実行可能ファイルの実行時に呼び出されます。実行可能ファイルは OnStart の前に実行されます。たとえば、続行すると、SCM が既にオブジェクトをメモリ内に保持しているため、コンストラクターが再度呼び出されることはありません。OnStop が OnStart ではなくコンストラクターで割り当てられたリソースを解放すると、サービスが 2 回目に呼び出されたときに、必要なリソースが再度作成されることはありません。

したがって、コンストラクターでイベント ログを初期化するために行っていることはすべて、イベントに移動する必要がありますOnStart。これにより、サービスが開始されるたびに適切に作成されることが保証されます。つまり、イベントを正しくログに記録できるはずですOnStart(初期化後に行う場合)。

于 2012-10-09T12:03:57.033 に答える