私はではありません。は、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が再構築されませんあなたのセットアッププロジェクト。上記のコードはうまくいくと思いますが、セットアッププロジェクトを明示的に右クリックしてビルドを選択しなくても、さまざまな修正を試みました。
私は、クリーンソリューションは、すべてのプロジェクトが次のビルドで再構築されるだろうと思った???
'GC.KeepAlive(timer);は間違いなく必要です。あなたのサービスはタイマーへの参照を保持します。あなたのサービスは確実に始まりますか?それは後ですぐに止まらないのは確かですか? – Will
'CheckCalls'メソッドでブレークポイントを実行しているときにサービスにデバッガを接続しようとしましたか? –
@ウィル:私はサービスが始まることは確かです。私のイベントログは、2つのスタブされたイベントを(OnStart内に)登録し、サービスをアンインストールするまでOnStopイベントを登録しません。 –