程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用C#創建計劃任務(How to create a Task Scheduler use C# )

使用C#創建計劃任務(How to create a Task Scheduler use C# )

編輯:C#入門知識

使用C#創建計劃任務(How to create a Task Scheduler use C# )


需求:在不定時間段運行多個後台程序(winfrom,wpf,console,等等)用於更新數據。       問題:為什麼要使用計劃任務,而不直接在程序中使用一個計時器來出發呢?   答:最明顯的一點,使用計時器程序一直在後台運行著,但需求中只需要一天運行一次,或一個月運行一次。一直後台跑著計時這不白浪費CPU資源麼。       解決方案:   1.使用windows自帶的計劃任務 在控制面板中可以看到,手動新建計劃任務。   2.使用微軟自帶的類庫TaskScheduler("c:\windows\system32\taskachd.dll")來創建    3.使用Process.Star() dos命令來創建計劃任務       這裡選用微軟自帶的類庫TaskScheduler,下面是封裝過的代碼,包含了刪除計劃任務、判斷計劃任務是否存在、獲取所有的計劃任務、創建計劃任務 。(具體看詳細注釋):      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("\\");             folder.DeleteTask(taskName, 0);         }           /// <summary>         /// get all tasks         /// </summary>         public static IRegisteredTaskCollection GetAllTasks()         {             TaskSchedulerClass ts = new TaskSchedulerClass();             ts.Connect(null, null, null, null);             ITaskFolder folder = ts.GetFolder("\\");             IRegisteredTaskCollection tasks_exists = folder.GetTasks(1);             return tasks_exists;         }         /// <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;         }           /// <summary>         /// create task         /// </summary>         /// <param name="creator"></param>         /// <param name="taskName"></param>         /// <param name="path"></param>         /// <param name="interval"></param>         /// <returns>state</returns>          public static _TASK_STATE CreateTaskScheduler(string creator, string taskName, string path,string interval)         {             try             {                 if (IsExists(taskName))                 {                     DeleteTask(taskName);                 }                   //new scheduler                 TaskSchedulerClass scheduler = new TaskSchedulerClass();                 //pc-name/ip,username,domain,password                 scheduler.Connect(null, null, null, null);                  //get scheduler folder                 ITaskFolder folder = scheduler.GetFolder("\\");                                    //set base attr                  ITaskDefinition task = scheduler.NewTask(0);                 task.RegistrationInfo.Author = "McodsAdmin";//creator                 task.RegistrationInfo.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 = "2015-04-09T14:27:25";//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;             }           }     }       注意:   1.引用taskachd.dll後選中按下F4在屬性中將 嵌入互操作類型 改為 False (沒設置會報一個錯誤: 無法嵌入互操作類型“TaskScheduler.TaskSchedulerClass”。請改用適用的接口。 )   2.schdule.Connec("pc-name 或者 ip","username","domain","password")   3.觸發器類型有多種選擇(按天IDailyTrigger,按分鐘ITimeTrigger));   觸發頻率(Interval)的格式需要遵循"PT1H1M"這樣的格式;   起始時間需要遵循"YYYY-MM-DDThh:mm:ss"這樣的格式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved