.NET Console程序在远程桌面运行时自动退出的问题

昨天写了一个Console小程序,本地测试运行良好,由于运行需要非常久的时间,为能不中断运行,上传到服务器上。没想今天查看的时候,程序还是莫名其妙的关了。所有程序的Exception都得到正常处理了,怎么还会如此?

带着疑问开始了艰难的排查...

首先要找的当然是程序打出来的日志,遗憾的是,即便是我所有的异常都已经做了日志记录,但打开日志文件却空空如也。

没有程序日志,难道是系统出现什么问题导致的?到系统里面翻了上下几遍,也是没有任何蛛丝马迹...

在这种情况下,无语。。。

进行无比艰辛的股沟和度娘之路,发现Console会退出的问题不过有如下几种:

1. 系统没有异常,由于分支的处理不当,导致程序执行完毕之后,自动退出。——这个就是网上那种程序一闪而过的原因了;

2. 系统还有未得到妥当处理的异常,导致程序直接崩溃退出。

为此,再次检查代码中的分支和系统异常处理。但艰难的检查完成之后,却没有发现任何异常,这让我再次陷入困境。

这期间,在进行了无数次本地和远程运行对比,发现远程关闭现象是出现在线程Sleep之后,让我误以为找到救命的稻草,可看前后代码之后,我被重重的拉入绝望的深渊 —— 这紧随之后的就是一个String赋值,难道,一个String赋值也会有错误???

在长时间的怀疑.NET和Windows系统的脆弱之后(AppDomain的UnhandledException祭出了都失效=.=!),再次步入艰辛的DEBUG事业中。。。

好在功夫不负有心人,在一天即将过去的时候,让我发现了Console会自动退出的第三种原因:

当运行Console之时,如果按下Ctrl+C,Console将会关闭.

这是什么狗屁原因?写过命令行程序的都知道。

但相信写过命令行的人中还有一部分(我就是其一)是不知道,这鼠标在远程桌面还能当Ctrl+C使用。。。

知道问题了,解决问题就变的简单而直接了,为了防止这种问题的出现,我在程序中加入了Ctrl+C的事件:

Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);

响应Ctrl+C事件,因为只是让Console跑而已,对Ctrl+C没有特别要求,因此,取消即可。

static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            e.Cancel = !e.Cancel; 
        }

后来为了对这事件的监控,在事件中加入了日志,以便必要的时候查看。

总结:虽然问题已经得到了有效解决,但是现在还是不明白,为什么在远程桌面上用鼠标移动窗口,怎么就会成了Ctrl+C命令传递给Console程序呢?

原创,转载请注明出处:MitchellChu's Blog——让自己有迹可寻

Sunday, February 19, 2012 | .NET技术 其他技术

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。