我有一个控制台应用程序,可以在Web应用程序中运行一些按需报告。应用程序启动,运行一些清理,启动(1秒)计时器,并阻止Console.ReadLine();
语句。 (我的意思是将其填入服务中,但那是另一天)
现在这没有异常处理,所以如果它轮询的sql服务器出现故障或网络打嗝,它就会崩溃。我正在尝试实现原始异常处理。在timer-callback里面,我把sql-query塞进了一个trycatch。如果失败,它会通过记录,增加失败计数器和恢复计时器来处理异常。如果它失败超过5次我希望它优雅地退出应用程序(某种程度)。如何强制退出使用readline语句阻止的控制台应用程序?
答案 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 \无论做什么,你都不应该强行杀死它们......