本文主要講解了如何使用C#來創建windows計劃任務。
問題:為什么要使用計劃任務,而不直接在程序中使用一個計時器來出發呢?
dos命令運行scheduler.exe 最簡單實例:
schtasks /create /sc minute /mo 1 /tn MyTask /tr calc.exe /st 09:00 //從9點開始每隔一分鐘運行一次記事本
具體幫助文檔可在cmd命令框輸入:
>schtasks /?
>schtasks /create /?
>schtasks /delete /?
>schtasks /query /?
>schtasks /change /?
解決方案開始:
這里選用微軟自帶的類庫TaskScheduler,下面是封裝過的代碼,包含了刪除計劃任務、判斷計劃任務是否存在、獲取所有的計劃任務、創建計劃任務 。(具體看詳細注釋):
獲取計劃任務的列表:

/// <summary> /// get all tasks /// </summary> public static IRegisteredTaskCollection GetAllTasks() { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("http://"); IRegisteredTaskCollection tasks_exists = folder.GetTasks(1); return tasks_exists; } View Code判斷計劃任務是否存在:

/// <summary> /// check task isexists /// </summary> /// <param name="taskName"></param> /// <returns></returns> public static bool IsExists(string taskName) { var isExists = false; IRegisteredTaskCollection tasks_exists = GetAllTasks(); for (int i = 1; i <= tasks_exists.Count; i++) { IRegisteredTask t = tasks_exists[i]; if (t.Name.Equals(taskName)) { isExists=true; break; } } return isExists; }View Code刪除計劃任務:

/// <summary> /// delete task /// </summary> /// <param name="taskName"></param> private static void DeleteTask(string taskName) { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("http://"); folder.DeleteTask(taskName, 0); }View Code創建計劃任務:

/// <summary> /// create scheduler /// </summary> /// <param name="creator"></param> /// <param name="taskName"></param> /// <param name="path"></param> /// <param name="interval"></param> /// <param name="startBoundary"></param> /// <param name="descrWord scheduler.Connect(null, null, null, null); //get scheduler folder ITaskFolder folder = scheduler.GetFolder("http://"); //set base attr ITaskDefinition task = scheduler.NewTask(0); task.RegistrationInfo.Author = creator;//creator task.RegistrationInfo.Description = description;//description //set trigger (IDailyTrigger ITimeTrigger) ITimeTrigger tt = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME); tt.Repetition.Interval = interval;// format PT1H1M==1小時1分鐘 設置的值最終都會轉成分鐘加入到觸發器 tt.StartBoundary = startBoundary;//start time //set action IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC); action.Path = path;//計劃任務調用的程序路徑 task.Settings.ExecutionTimeLimit = "PT0S"; //運行任務時間超時停止任務嗎? PTOS 不開啟超時 task.Settings.DisallowStartIfOnBatteries = false;//只有在交流電源下才執行 task.Settings.RunOnlyIfIdle = false;//僅當計算機空閑下才執行 IRegisteredTask regTask = folder.RegisterTaskDefinition(taskName, task, (int)_TASK_CREATION.TASK_CREATE, null, //user null, // password _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, ""); IRunningTask runTask = regTask.Run(null); return runTask.State ; } catch (Exception ex) { throw ex; } }View Code
完整代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using TaskScheduler;namespace McodsBgManager{ public class SchTaskExt { /// <summary> /// delete task /// </summary> /// <param name="taskName"></param> private static void DeleteTask(string taskName) { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("http://"); folder.D
新聞熱點
疑難解答