2017-09-11 19 views
1

マイウィンドウサービスアプリケーションでは、タイマー機能が呼び出されません。私は自分のマシンにサービスをデプロイし、別の機能でブレークポイントを持つVisual Studioにサービスを添付しました。 OnStart()の後、私の関数は呼び出されません。C#ウィンドウサービスがタイマー機能を呼び出さない

はここで更新私のOnStart()機能

protected override void OnStart(string[] args) 
{ 
    this.timer = new System.Timers.Timer(50000); 
    this.timer.AutoReset = true; 
    this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick); 
    this.timer.Start(); 
} 

だ2017年9月12日:追加イベントは、tryでログインしてこの関数は、その後timer1_tick()呼び出す をキャッチ:timer1_tick

private void timer1_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     EventLog.WriteEntry("Running.."+ e.ToString()); 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry("Caught Exception "+ex.ToString(), EventLogEntryType.Error); 
    } 
} 

と呼ばれることはありません。助言がありますか?

更新12/09/2017:イベントログを確認しました。 Windows Logs> Applicationの下で、サービスが正常に開始されたというメッセージが表示されます。ただし、try-catchブロックに追加されたイベントログは表示されません。私が何かを逃しているかどうかは分かりません

デバッグのためにVisual Studioにサービスを添付しました。下の画像では、OnStart()メソッドが呼び出されます。私はタイマーが起動した後OnStart()機能

enter image description here

をスキップ避けるために、デバッガにアタッチ処理をするためにいくつかのバッファ時間を得るように私はちょうど私が期待しTIMERTICK()関数にブレークポイントを持って、Thread.Sleep(30000)を追加しましたそれがヒットするが、それは決してOnStartが適切と思わあなたに可能性がすべてと呼ばれている

+0

あなたは十分に待っていましたか?多分愚かな質問かもしれませんが、あなたは決して知らないでしょう:) –

+0

より低い間隔で初期化し、timer1_Tick内にtry \ catchを入れて、例外が発生した場合にログに記録してみてください。 –

+0

@MartinoBordin私は間隔を5秒に減らし、try-catchブロックを追加しましたが、私は電子メールを受け取っていません。 –

答えて

2

timer1_Tick

enter image description here

もしないことにします。おそらく、あなたが電子メールを受け取っていない理由は、 _SendEmailが例外を投げているからです。

EventLogに書き込むと、詳細情報が表示される場合があります。私もOnStartOnStopEventLogに書くとベストプラクティスとして

private void timer1_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     SendMail._SendMail("Processing A started at" + DateTime.Now.ToString()); 
     Logging.log.LogInput("start refund process"); 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
    } 
} 

protected override void OnStart(string[] args) 
{ 
    // Log a service start message to the Application log. 
    EventLog.WriteEntry("My Service in OnStart."); 

    timer = new System.Timers.Timer(50000); 
    timer.AutoReset = true; 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick); 
    timer.Start(); 
} 

protected override void OnStop() 
{ 
    // Log a service stop message to the Application log. 
    EventLog.WriteEntry("My Service in OnStop."); 
} 
+0

あなたが提案した通りイベントログを追加しました。私はtryブロックにそれらを追加しましたが、イベントビューアはメッセージを表示しません。それはサービスが正常に開始したことを示しますが、それ以降は何もありません。 –

+0

@AnanthKumbleあなたの問題はあなたが提供したコードに含まれていません。私はそれに何もない単純なサービスを作成したが、タイマーと期待どおりに動作します。あなたのサービスは稼働し続けていますか、おそらくクラッシュしていますか? –

+0

サービスは引き続き動作し続けます。私は別のウィンドウサービスプロジェクトを作成し、タイマー関数は期待どおりに呼び出されました。私は、既存のウィンドウサービスプロジェクトでこの問題を解決しようとしています –

関連する問題