从我心中最深处的角落来看,我记得Windows应用程序可以响应退出的请求;考虑到这一点,我能够谷歌AppDomain.CurrentDomain.ProcessExit.然而,似乎任务计划程序的“停止任务…”和AppDomain.CurrentDomain.ProcessExit不能像我希望的那样一起工作;这是一个示例程序,我把它放在一起不起作用:
using System; using System.Threading; using System.Windows.Forms; namespace GimmeJustASec { class Program { static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(SuddenCleanup); while(true) { Thread.Sleep(1000); } } static void SuddenCleanup(object sender,EventArgs e) { MessageBox.Show("Hello!"); } } }
我的问题是:
>是否可以编写程序来响应任务计划程序停止它? (或者任务计划程序以最粗鲁的方式强制退出任务吗?)
>如果程序可以用这种方式编写,那么这样做的正确方法是什么? (我尝试的方式显然不正确.)
>我是否过度思考所有这一切,将程序时间本身放在并行线程中会更好? (也许在app.config中设置了最大时间,或者其他什么.)
[edit]在Andrew Morton的请求中尝试了这个变体,结果类似:
using System; using System.Threading; using System.Windows.Forms; using System.IO; namespace GimmeJustASec { class Program { private static StreamWriter _log; static void Main(string[] args) { _log = File.CreateText("GimmeJustASec.log"); _log.AutoFlush = true; _log.WriteLine("Hello!"); AppDomain.CurrentDomain.ProcessExit += new EventHandler(SuddenCleanup); while(true) { Thread.Sleep(1000); } } static void SuddenCleanup(object sender,EventArgs e) { _log.WriteLine("Goodbye!"); } } }
任务计划程序停止任务后,.log文件包含“Hello!”但不是“再见!”
解决方法
SetConsoleCtrlHandler
).总而言之,这并没有让我对应用程序本身没有执行的干净退出抱有太多希望.
这不能回答原始问题,即您是否可以检测到任务计划程序发出的停止请求,如果是,则如何检测.我试图确定它是如何工作的,但是我失败了:如果我在任务计划程序下运行一个拒绝退出的控制台应用程序,它会很快继续运行,即使我已将其配置为在10秒或1秒后终止分钟. (你不能在接口上设置这么短的时间,但你可以从命令行.)我没有测试Task Scheduler支持的最短时间,1小时是否有效.我还没有测试使用实际计划时的情况是否有所不同,而不是手动触发的任务.但是,如果你手动结束一个任务,它肯定只是调用TerminateProcess并且没有给你任何干净退出的机会 – 仅此一点应该是一些动机,不要把你的代码用于任务本身的信号失败.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。