如何在 .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();
}
}
}
我有一个控制台应用程序,如下所示,它有 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();
}
}
}