3

System.Timers.Timer に問題があります。正確には例外をスローしません。これが私のコードです:

private Timer MyTimer { get; set; }

public MyService()
{
    InitializeComponent();
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    MyTimer = new Timer(10 * 1000);
    MyTimer.Elapsed += MyTimer_Elapsed;
}

protected override void OnStart(string[] args)
{
    MyTimer.Enabled = true;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    if (!EventLog.SourceExists(EVENTLOGSOURCE))
    {
        EventLog.CreateEventSource(EVENTLOGSOURCE, EVENTLOGDESCRIPTION);
    }
    EventLog.WriteEntry(EVENTLOGSOURCE, "UnhandledException\r\n" + e.ExceptionObject, EventLogEntryType.Error);
    EventLog.WriteEntry(EVENTLOGSOURCE, "UnhandledExceptionEventArgs.IsTerminating: " + e.IsTerminating, EventLogEntryType.Error);

    if (e.IsTerminating)
    {
        this.ExitCode = 100;
        //this.Stop();
    }
}

private void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    MyTimer.Enabled = false;
    CurrentDomain_UnhandledException(AppDomain.CurrentDomain, new UnhandledExceptionEventArgs(new Exception("FakeExceptionForTestPurposeOnly: It will be logged!"), false));

    Int32 i = Convert.ToInt32("10_ForSureGeneratesException_10");
}

したがって、私のイベント ログには、「FakeExceptionForTestPurposeOnly: ログに記録されます!」というメッセージが表示されます。しかし、それは唯一のものです!

結局のところ、さらに悪いのは、まだ実行中のサービスです。それはどのように可能ですか?

私はすでに問題を解決していることに注意してください。その場合、タイマーの使用は必須ではありません。System.Threading.Thread はそのトリックを実行し、時計仕掛けとして機能します。私はちょうど興味があると思います...

問題は、MyTimer_Elapsed() で UnhandledExceptions が発生したときに、「CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)」が発生しないのはなぜですか?

ヘルプ、提案、コメントをいただければ幸いです

4

1 に答える 1

3

Windows サービスでは、「メイン」スレッドは、およびメソッドService Control Managerを呼び出すによって所有されます。「メイン」スレッドで例外が発生すると、クラスは例外処理を担当するため、例外を処理し、呼び出しチェーンに伝播しません。OnStartOnStopServiceBase

SynchronizationContextWindows サービス内には存在しないはずなのでElapsed、別のThreadPoolスレッドでイベントを発生させる必要がありますが、代わりに試してみて、イベントがコールバックを呼び出しSystem.Threading.Timerたときに例外が伝播するかどうかを確認することをお勧めします。Elapsed

于 2014-08-01T07:29:01.247 に答える