2011-01-14 20 views
1

私はではありません。は、Windows Form Timerを使用しています - 私はSystem.Threading.Timerを使用しています。タイマーをインスタンス化する際に例外は発生しません。また、System.Threading.Timerを明示的に起動する必要はありません。なぜSystem.Threading.Timerコールバックが起動しないのですか?

私はSystem.Timers.Timer(コードのコメントを参照)を使用し、コールバックの署名を変更することを試みました。コールバックメソッドの中で、私はEventLogの書き込みをスタブし、イベントログへの最初の書き込みもスタブしませんでした。イベントログに表示されているのは、MyService.OnStartとMyServiceが起動した後です(これらは両方ともOnStartイベントからのものです)。タイマーのコールバックイベントが発生しないのはなぜですか?

public partial class MyService : ServiceBase 
{ 

    private static System.Threading.Timer timer; 

    public MyService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("MyService")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "MyService", "MyServiceLog"); 
     } 
     eventLog1.Source = "MyService"; 
     eventLog1.Log = "MyServiceLog"; 
    } 

    protected override void OnStart(string[] args) 
    { 
     eventLog1.WriteEntry("MyService.OnStart event fired"); 

     // setup timer to poll and execute an event 
     //Timer timer = new Timer(new TimerCallback(CheckCalls), null, 0, 10000); 
     try 
     { 
      timer = new System.Threading.Timer(new System.Threading.TimerCallback(CheckCalls), null, 0, 10000); 
     } 
     catch (Exception ex) 
     { 
      eventLog1.WriteEntry(ex.Message + " Stacktrace: " + ex.StackTrace); 
     } 

     eventLog1.WriteEntry("MyServicestarted"); 

     GC.KeepAlive(timer); 
    } 
} 

とコールバックメソッド、CheckCalls:

private static void CheckCalls(object objectState) 
    { 
     EventLog eventLog1 = new EventLog("MyServiceLog", "DAVIDWIN7", "MyService"); 
      eventLog1.WriteEntry("MyService is polling"); 
    } 
のArg - 何らかの理由であなたがビルド - >クリーンソリューションは、ビルド - >はソリューションのビルド、Visual Studioが再構築されませんあなたのセットアッププロジェクト。上記のコードはうまくいくと思いますが、セットアッププロジェクトを明示的に右クリックしてビルドを選択しなくても、さまざまな修正を試みました。

私は、クリーンソリューションは、すべてのプロジェクトが次のビルドで再構築されるだろうと思った???

+2

'GC.KeepAlive(timer);は間違いなく必要です。あなたのサービスはタイマーへの参照を保持します。あなたのサービスは確実に始まりますか?それは後ですぐに止まらないのは確かですか? – Will

+0

'CheckCalls'メソッドでブレークポイントを実行しているときにサービスにデバッガを接続しようとしましたか? –

+0

@ウィル:私はサービスが始まることは確かです。私のイベントログは、2つのスタブされたイベントを(OnStart内に)登録し、サービスをアンインストールするまでOnStopイベントを登録しません。 –

答えて

0

イベントログへのタイマースレッドの書き込みでエラーが発生することがあります。

私は自分のコンピューター上で動作させましたが、私はイベントログのアクセス許可を混乱させたくないので、すべてのイベントログをConsole.writelineに置き換えました。

+0

遅れていたのは申し訳ありませんが、これが修正されました。イベントログの書き込みに何か問題がありました。 –

0

サービスが実行されているアカウントでイベントログにアクセスできるかどうかを確認しましたか?

+0

しましたが、ありがとうございます。私はLocalSystem、LocalServiceなどを試しました –

0

あなたが行くとあなたが話している正確なシナリオを反映し、このテストアプリケーションダウンロードすることができますしてください:

https://docs.google.com/leaf?id=0Bw_NnV9fhgmgMThjNDgzOTgtODNiOC00NDE1LWEyMTYtNzVhOTMyNzlmZjZk&hl=en&authkey=CMuupNkC

は、私はこれを作成しました。これは、あなたと同じコードを効果的に使用するサービスです。唯一の違いは、ツールボックスを使用してイベントログをサービスデザイナーにドラッグ&ドロップし、ログを「Application」に設定し、ソースを「Service1」に設定したことです。

プロジェクトフォルダでVSコマンドプロンプトを開き、bin\debugに移動し、installutil windowsservice1.exeを実行します。これにより、いくつかの資格情報が指定されます(bin出力フォルダから直接devサービスをインストールします)。

サービスを開始し、アプリケーションログを監視します。コードから見えるように10秒ごとに書き込みます。

私のマシン(tm)と同じように、これがあなたのマシン(tm)上で動作すると仮定すると、問題はイベント自体がロギングされているか、ホラーの恐怖です - あなたのサービスはあなたのビルド私のチームの開発者のほとんどは、別のフォルダからdevサービスを実行して、デバッグを開始すると実際にバイナリを更新するのを忘れたときに誓います!

私のコメントで示唆したように、デバッガをこれに接続し、コールバックをブレークポイントして起動できないことを確認する必要があります。ログがいっぱいになったり、アクセス許可があなたなどを妨げたりする可能性があるため、診断メッセージのイベントログには決して依存しません。Windowsプラットフォームコンポーネントかもしれませんが、私が望むほど信頼性がありません。

しかし、デバッガはほとんど存在しません(デプロイされたバイナリが期限切れでない限り)。プロジェクトのデバッグビルドをコンパイルし、をサービスリストにインストールされていることを確認して起動し、をサービスexeに直接添付します([service] .vshostに接続しようとするポイントはありません)。 exe - VSは、Windowsサービスを自動接続またはホストできません。実行できる唯一の方法は、svchost.exe経由で実行する方法です)。

これが役に立ちます。

関連する問題