正在退出基于计时器的轮询循环

本文关键字:循环 计时器 退出 | 更新日期: 2023-09-27 17:59:15

我有一个控制台应用程序,它在Web应用程序中运行一些按需报告。该应用程序启动,运行一些家庭清洁,启动(1秒)计时器,并阻止Console.ReadLine();语句。

现在,它没有异常处理,所以如果它所轮询的sql服务器出现故障或网络故障,它就会崩溃。我现在正试图实现一个粗糙的异常处理。在计时器回调中,我将sql查询填充到了trycatch中。如果失败,它会通过记录、增加故障计数器和恢复计时器来处理异常。如果失败超过5次,我希望它(有点)优雅地退出应用程序。如何强制退出被readline语句阻止的控制台应用程序?

要点代码:https://gist.github.com/cwattengard/11171563

正在退出基于计时器的轮询循环

我认为一个更优雅的解决方案是用重置事件进行阻塞。计时器回调在它认为不再有工作要做的时候设置这个

static readonly ManualResetEvent reset = new ManualResetEvent(false);
static void Main(string[] args)
{
    var t = new Timer(TimerCallback, null, -1, 1000);
    t.Change(0, 1000);
    reset.WaitOne(); // the application will sit here until the timer tells it to continue.
}
private static void TimerCallback(object state)
{
    try
    { 
       // do stuff.
    }
    catch (Exception e)
    {
        failureCounter++;
        if (failureCounter > 5)
        {
            reset.Set(); // release the reset event and the application will exit,
            return;
        }
    }
}

最好的方法是使用某种信号机制。例如,启动主线程,进行所有初始化(定时器等),然后创建一个无信号的ManualResetEvent并等待它启动。如果来自计时器的回调决定应用程序应该终止,它会发出ManualResetEvent信号,主线程将被释放、完成并终止程序。。。

作为一种通用方法,您应该始终在应用程序中使用信令和"协作多任务"。从某种意义上说,你向其他线程''任务''参与者''发出信号,无论他们做什么,你都不应该强行杀死他们。。。