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)」が発生しないのはなぜですか?
ヘルプ、提案、コメントをいただければ幸いです