如何在 .net 中控制任务调度程序中的几个方法

How to control few methods in task scheduler in .net

我有一个控制台应用程序,如下所示,它有 4 个方法,如 Sendmail(),Downloadfile(),ProcessFile(),ExportFIle(),我将其作为任务调度程序,每天早上 运行 8:AM。但有时像12 点我只想 运行 ProcessFile()ExportFIle()。所以我以前做的是,我将在 Visual studio 打开应用程序然后评论 Sendmail() 和 Downloadfile() 这样我就可以 运行 只有剩下的两个 functions.But 问题是如果我忘记取消注释代码,第二天早上 8 点调度程序将 运行 只有两个功能。有什么办法可以在不注释代码的情况下处理这种情况吗??

namespace Testconsole
{
    class Program
    {
        static void Main(string[] args)
        {

            Sendmail();
            Downloadfile();
            ProcessFile();
            ExportFIle();
        }
    }
}

最简单的解决方案是利用像 CronNet

这样的调度框架

UPDATE 如果您不想让第三方 dll 管理它 - 您可以在控制台应用程序中引入一些命令行参数:

  • 默认情况下,如果没有传递参数 - 所有任务都是 运行
  • 如果指定了特定任务名称 - 运行 仅该任务
  • 引入一些从字符串命令行参数到您的方法的简单映射 - 简单 Dictionary<string,Action> 或只是一些反射 - 基于约定的映射

例如: myScheduler.exe ProcessFile ExportFile

您可以单独安排每个任务CronJob

您的代码可能看起来像这样(这是基于 CronNet wiki)

using System.Threading;
using CronNET;

namespace CronNETExample.Console
{
    class Program
    {
        private static readonly CronDaemon cron_daemon = new CronDaemon();            

        static void Main(string[] args)
        {
            cron_daemon.add_job(new CronJob("* * * * *", Sendmail));
            cron_daemon.add_job(new CronJob("* * * * *", Downloadfile));
            cron_daemon.add_job(new CronJob("* * * * *", ProcessFile));
            cron_daemon.add_job(new CronJob("* * * * *", ExportFIle));

            cron_daemon.start();

            // Wait and sleep forever. Let the cron daemon run.
            while(true) Thread.Sleep(6000);
        }
    }
}

您可以编译两个版本的代码而忽略 VS。

无论如何,没有所有评论和编译的更优雅的方法是使用像 Quartz.Net 这样的时间调度程序,并将您的程序用作 windows 服务。

编写配置 XML 文件。然后,控制台应用程序必须读取该文件以决定使用哪些方法 运行,然后您可以在需要更改时随时更改 XML,而无需更改代码本身。

您还可以将您的应用程序拆分为 4 个不同的控制台应用程序,然后 运行 每个单独的应用程序。在自己的预定任务中。通过使用 Windows 任务调度程序。

或者,您可以更改 main 方法以接受参数,这些参数将指示要 运行 的方法,然后将它们包含在计划任务中,您已经 运行ning。

class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Sendmail();
            Downloadfile();
            ProcessFile();
            ExportFile();
        }

        foreach (string s in args)
        {
            switch (s)
            {
                case "SendMail":
                    Sendmail();
                    break;
                //etc.
            }
        }
    }
}

一种简单的方法是将您的 "actuator" 函数包装到两个单独的计划函数中:

namespace Testconsole
{
    class Program
    {
        static void Main(string[] args)
        {
          if (args[0] = "8")
            ScheduleFor8();
          if (args[0] = "12")
            ScheduleFor12();

        }
        static void ScheduleFor8() {
            Sendmail();
            Downloadfile();
            ProcessFile();
            ExportFIle();
        }
        static void ScheduleFor12() {
            ProcessFile();
            ExportFIle();
        }
    }
}