計划任務程序是Windows
Vista以及Windows7中一個很有用的附件。本文是一篇快速教程,講解了如何在托管代碼中使用計划任務程序。若要了解更多的詳細解釋,敬請訪問Bart De
Smet相應的博客文章。
Windows
Vista與Windows7提供了一種可能,就是能夠創建復雜的任務,使得它們可以在不同時刻及時運行。它還提供了一個很棒的特性,可以通過托管代碼訪問嵌入到操作系統中的計划任務程序的功能。首先,創建一個C#控制台應用程序,然后從System32文件夾中導入taskschd.dll文件。它將會創建計划任務程序的COM互操作程序集。然后,像這樣創建一個TaskSchedulerClass對象:
TaskSchedulerClass scheduler = new TaskSchedulerClass();
接下來連接scheduler對象:
TaskSchedulerClass scheduler = new
TaskSchedulerClass();
scheduler.Connect(null, null, null, null);
下一步是創建一個任務,並設置它具有的大量屬性:
ITaskDefinition task = scheduler.NewTask(0);
task.RegistrationInfo.Author
= "Author";
task.RegistrationInfo.Description = "New
Task";
task.Settings.RunOnlyIfIdle = true;
下面是選擇任務應該啟動的時刻。方法就是通過觸發器。我們的范例使用了一個每日觸發的觸發器,如下所示:
IDailyTrigger trigger =
(IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);
trigger.Id
= "DailyTrigger";
trigger.StartBoundary =
"2008-01-01T12:00:00";
trigger.EndBoundary = "2008-01-31T12:00:00";
當觸發器中設置的條件滿足要求時,任務就會運行。但是必須定義動作(action),否則任務什么都不會做。這是一個范例:
IEmailAction action =
(IEmailAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SEND_EMAIL);
action.Id
= "Email action";
action.Server = "server...";
action.From
= "sender...";
action.To = "recipient...";
action.Subject = "The
subject of the email...";
action.Body = "The body text of the email...";
該任務幾乎隨時可以使用,僅僅需要對其進行注冊。
ITaskFolder folder = scheduler.GetFolder("\\Task");
IRegisteredTask regTask =
folder.RegisterTaskDefinition(
"Test",
task,
(int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
null,
//user
null, // password
_TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN,
"");
任務一旦完成並被注冊,就能夠立即運行,如下所示,或者使用“schtasks /run”。
IRunningTask runTask = regTask.Run(null);
將這些代碼集中在一起,則結果為:
using System;
using System.Collections.Generic;
using System.Text;
namespace TaskScheduler {
class Program
{
static void Main (string[] args)
{
TaskSchedulerClass scheduler = new
TaskSchedulerClass();
scheduler.Connect(null, null, null, null);
ITaskDefinition task =
scheduler.NewTask(0);
task.RegistrationInfo.Author =
"Author";
task.RegistrationInfo.Description = "New
Task";
task.Settings.RunOnlyIfIdle = true;
IDailyTrigger trigger =
(IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);
trigger.Id =
"DailyTrigger";
trigger.StartBoundary =
"2008-01-01T12:00:00";
trigger.EndBoundary = "2008-01-31T12:00:00";
IEmailAction action =
(IEmailAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SEND_EMAIL);
action.Id = "Email
action";
action.Server =
"server...";
action.From =
"sender...";
action.To =
"recipient...";
action.Subject = "The subject of the
email...";
action.Body = "The body text of the email...";
ITaskFolder folder = scheduler.GetFolder("\\Task");
IRegisteredTask regTask =
folder.RegisterTaskDefinition(
"Test",
task,
(int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
null,
//user
null, //
password
_TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN,
"");
IRunningTask runTask =
regTask.Run(null);
}
}
}
查看英文原文:Using the Task Scheduler in Vista and Windows Server 2008
:
http://www.infoq.com/news/2008/02/TaskScheduler
【作者 Abel
Avram 譯者 張逸 http://www.infoq.com/cn/news/2008/03/TaskScheduler】
