微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以编写一个C#程序 – 当作为计划任务运行时 – 检测任务计划程序何时尝试停止它

也许我误解了 Windows的任务计划用户界面的这一部分,但是以下选项建议(对我来说)程序首先被要求很好地停止,然后在失败时强行退出

if the running task does not end when requested...

从我心中最深处的角落来看,我记得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!”但不是“再见!”

解决方法

处理这个问题的正确方法是假设您的程序突然死亡而没有任何机会运行代码(因为,你知道,它可以 – 假设.NET运行时有一个触发崩溃的错误)并在外面检测到该程序,所以你可以从那里进行邮件/日志记录.如果您可以延迟,您仍然可以从程序本身执行此操作:在下一个任务运行时检测到不干净的关闭,然后通知.这比在进程停止时(无论出于何种原因)尝试进行清理/信令更可靠.对于控制台应用程序(如果你正在使用它们)尤其如此,因为退出通常为 doesn’t even run any finalizers,除非你为它编写代码(AppDomain.ProcessExit和Console.CancelKeyPress是不够的,你必须去 all the way to SetConsoleCtrlHandler).总而言之,这并没有让我对应用程序本身没有执行的干净退出抱有太多希望.

这不能回答原始问题,即您是否可以检测到任务计划程序发出的停止请求,如果是,则如何检测.我试图确定它是如何工作的,但是我失败了:如果我在任务计划程序下运行一个拒绝退出的控制台应用程序,它会很快继续运行,即使我已将其配置为在10秒或1秒后终止分钟. (你不能在接口上设置这么短的时间,但你可以从命令行.)我没有测试Task Scheduler支持的最短时间,1小时是否有效.我还没有测试使用实际计划时的情况是否有所不同,而不是手动触发的任务.但是,如果你手动结束一个任务,它肯定只是调用TerminateProcess并且没有给你任何干净退出的机会 – 仅此一点应该是一些动机,不要把你的代码用于任务本身的信号失败.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐