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("無效的數(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("無效的數(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)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡(jiǎn)單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
C#實(shí)現(xiàn)萬物皆可排序的隊(duì)列方法詳解
本文詳細(xì)講解了C#實(shí)現(xiàn)萬物皆可排序隊(duì)列的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C# 文件操作函數(shù) 創(chuàng)建文件 判斷存在
本文列舉了C#中文件操作中常用的函數(shù),創(chuàng)建文件和判斷文件存不存在的基本使用,簡(jiǎn)單實(shí)用,希望能幫到大家。2016-05-05
c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼
c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-05-05
在C#中如何使用ResNet50v2進(jìn)行圖像識(shí)別
ONNX?運(yùn)行時(shí)推理可以實(shí)現(xiàn)更快的客戶體驗(yàn)和更低的成本,支持來自深度學(xué)習(xí)框架如?PyTorch和TensorFlow/Keras以及經(jīng)典機(jī)器學(xué)習(xí)庫如?scikit-learn、LightGBM、XGBoost?等的模型,這篇文章主要介紹了在C#中如何使用ResNet50v2進(jìn)行圖像識(shí)別,需要的朋友可以參考下2024-07-07
C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事
這篇文章主要給大家介紹了關(guān)于C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
C#實(shí)現(xiàn)在窗體上的統(tǒng)計(jì)圖效果
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)在窗體上的統(tǒng)計(jì)圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

