C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的示例代碼
本文和大家分享一個(gè)自己寫的 Windows 定時(shí)任務(wù)計(jì)劃(Task Scheduler) 動(dòng)態(tài)創(chuàng)建代碼,沒做太多封裝,留個(gè)實(shí)現(xiàn)筆記
首先封裝一個(gè)簡(jiǎn)單配置項(xiàng)的類
核心代碼
public class TaskSchedulerConfig
{
/// <summary>
/// 引用程序路徑
/// </summary>
public string ApplicationPath { get; set; }
/// <summary>
/// 引用程序參數(shù)
/// </summary>
//public string ApplicationParameter { get; set; }
/// <summary>
/// 任務(wù)名稱
/// </summary>
public string TaskName { get; set; }
/// <summary>
/// 任務(wù)說明
/// </summary>
public string TaskDescription { get; set; }
/// <summary>
/// 任務(wù)執(zhí)行周期 0 每日?qǐng)?zhí)行 1 每周執(zhí)行 2 每月執(zhí)行
/// </summary>
public int TaskExecutionCycle { get; set; }
/// <summary>
/// 開始執(zhí)行時(shí)間范圍 yyyy/MM/dd HH:mm:ss
/// </summary>
public DateTime StartBoundary { get; set; }
/// <summary>
/// 每月的第幾號(hào)執(zhí)行
/// </summary>
public int DaysOfMonth { get; set; }
/// <summary>
/// 每周的周幾執(zhí)行
/// </summary>
public int DaysOfWeek { get; set; }
}兩個(gè)范圍判定的方法
/// <summary>
/// 根據(jù)數(shù)字1-7來設(shè)置周一 - 周日
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
static DaysOfTheWeek GetDaysOfTheWeek(int num)
{
switch (num)
{
case 1:
return DaysOfTheWeek.Monday;
case 2:
return DaysOfTheWeek.Tuesday;
case 3:
return DaysOfTheWeek.Wednesday;
case 4:
return DaysOfTheWeek.Thursday;
case 5:
return DaysOfTheWeek.Friday;
case 6:
return DaysOfTheWeek.Saturday;
case 7:
return DaysOfTheWeek.Sunday;
default:
throw new ArgumentException("無(wú)效的數(shù)字。請(qǐng)?zhí)峁?到7之間的數(shù)字。");
}
}
/// <summary>
/// 限定每月只能在1-28號(hào)之間執(zhí)行任務(wù)
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
static int GetDaysOfMonth(int num)
{
if (num < 1 || num > 28)
{
throw new ArgumentException("無(wú)效的數(shù)字。請(qǐng)?zhí)峁?到28之間的數(shù)字。");
}
return num;
}Main
static void Main(string[] args)
{
TaskSchedulerConfig taskSchedulerConfig;
try
{
var taskSchedulerConfigJson = args[0];
taskSchedulerConfig = JsonConvert.DeserializeObject<TaskSchedulerConfig>(taskSchedulerConfigJson);
}
catch
{
string demo = @"{
""ApplicationPath"": ""C:\\YourApplication\\YourExecutable.exe"",
""TaskName"": ""DailyTask"",
""TaskDescription"": ""This is a daily task"",
""TaskExecutionCycle"": 0,
""StartBoundary"": ""2024/02/28 08:00:00"",
""DaysOfMonth"": 28,
""DaysOfWeek"": 3
}";
Console.WriteLine($"參數(shù)錯(cuò)誤,正確示例:{demo}");
return;
}
try
{
using (TaskService taskService = new TaskService())
{
// 創(chuàng)建一個(gè)新任務(wù)
TaskDefinition taskDefinition = taskService.NewTask();
taskDefinition.Principal.UserId = "SYSTEM"; // 設(shè)置為SYSTEM以在系統(tǒng)級(jí)別運(yùn)行
// 設(shè)置任務(wù)的基本信息
taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription;
switch (taskSchedulerConfig.TaskExecutionCycle)
{
case 0:
DailyTrigger dailyTrigger = new DailyTrigger();
dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
dailyTrigger.DaysInterval = 1; // 每天執(zhí)行
taskDefinition.Triggers.Add(dailyTrigger);
break;
case 1:
WeeklyTrigger weeklyTrigger = new WeeklyTrigger();
weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek);
weeklyTrigger.WeeksInterval = 1; // 每隔1周執(zhí)行
taskDefinition.Triggers.Add(weeklyTrigger);
break;
case 2:
MonthlyTrigger monthlyTrigger = new MonthlyTrigger();
monthlyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
monthlyTrigger.DaysOfMonth = new[] { GetDaysOfMonth(taskSchedulerConfig.DaysOfMonth) };
monthlyTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; // 每個(gè)月執(zhí)行
taskDefinition.Triggers.Add(monthlyTrigger);
break;
default:
Console.WriteLine("任務(wù)執(zhí)行周期參數(shù)錯(cuò)誤!正確示例:0 每日?qǐng)?zhí)行 1 每周執(zhí)行 2 每月執(zhí)行");
break;
}
// 設(shè)置要執(zhí)行的程序路徑
taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null));
// 將任務(wù)注冊(cè)到 Windows 任務(wù)計(jì)劃程序
taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition);
Console.WriteLine("任務(wù)計(jì)劃創(chuàng)建成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"創(chuàng)建{taskSchedulerConfig.TaskName} 任務(wù)錯(cuò)誤,錯(cuò)誤原因是:{ex.Message}");
}
}
到此這篇關(guān)于C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的示例代碼的文章就介紹到這了,更多相關(guān)C#定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句實(shí)例
這篇文章主要介紹了C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句,以實(shí)例形式較為詳細(xì)的分析了C#執(zhí)行sql語(yǔ)句的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
c# 獲取網(wǎng)頁(yè)中指定的字符串信息的實(shí)例代碼
c# 獲取網(wǎng)頁(yè)中指定的字符串信息的實(shí)例代碼,需要的朋友可以參考一下2013-04-04
C#基礎(chǔ)知識(shí)之base關(guān)鍵字介紹
本文主要介紹base關(guān)鍵字的使用方法,base關(guān)鍵字可以調(diào)用基類重寫的方法,可以調(diào)用基類的構(gòu)造方法,還可以在EntityFramework中使用,下面一一介紹。2016-04-04
C#獲取計(jì)算機(jī)硬件與操作系統(tǒng)的相關(guān)信息
這篇文章介紹了C#獲取計(jì)算機(jī)硬件與操作系統(tǒng)相關(guān)信息的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#最簡(jiǎn)單的關(guān)閉子窗體更新父窗體的實(shí)現(xiàn)方法
原理就是將子窗體最為對(duì)話框模式彈出,當(dāng)窗體關(guān)閉或取消時(shí)更新主窗體2012-11-11

