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

时间:2014-04-22 09:23:50

标签: c# polling

我有一个控制台应用程序,可以在Web应用程序中运行一些按需报告。应用程序启动,运行一些清理,启动(1秒)计时器,并阻止Console.ReadLine();语句。 (我的意思是将其填入服务中,但那是另一天)

现在这没有异常处理,所以如果它轮询的sql服务器出现故障或网络打嗝,它就会崩溃。我正在尝试实现原始异常处理。在timer-callback里面,我把sql-query塞进了一个trycatch。如果失败,它会通过记录,增加失败计数器和恢复计时器来处理异常。如果它失败超过5次我希望它优雅地退出应用程序(某种程度)。如何强制退出使用readline语句阻止的控制台应用程序?

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

2 个答案:

答案 0 :(得分:1)

我认为更优雅的解决方案是阻止重置事件。当计时器回调认为它不再有工作要做时,它会在某个时刻设置它。

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;
        }
    }
}

答案 1 :(得分:0)

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

作为一般方法,您应该始终在您的应用程序中使用信令和“合作多任务”。从某种意义上说,你发信号通知其他线程\ tasks \ actors \无论做什么,你都不应该强行杀死它们......