【问题标题】:Is it possible to use Windows 7 Task scheduler in own application是否可以在自己的应用程序中使用 Windows 7 任务调度程序
【发布时间】:2011-03-22 12:36:18
【问题描述】:

我正在开发基于附加组件的应用程序。每个附加组件都使用调度程序。加载的附加计划任务。我的应用程序只运行一个实例。有时应用程序关闭,有时正在运行。因此我需要使用 Windows 7 任务调度程序

如何在自己的应用上使用任务调度器?

我需要从应用程序创建新任务
我需要在任务完成后向我的应用程序发送消息或调用我的应用程序的任何功能
有可能吗?
怎么办?

【问题讨论】:

    标签: c# windows-7 windows-services scheduling task


    【解决方案1】:

    在 CodeProject 上查看这个项目。

    A New Task Scheduler Class Library for .NET

    【讨论】:

    • 是的。它可以在 Vista 上运行,因此也可以在 Windows 7 上运行。它的功能与 Kate Gregory 所描述的一样。
    【解决方案2】:

    如果您想从您的代码中与 Windows 7 计划任务系统交互来创建、管理或删除一个任务,那也没问题。 (我在为 Pluralsight 编写的 Windows 7 课程中对此进行了介绍。)添加对 TaskScheduler 的 COM 引用,然后您就可以执行以下操作:

    ITaskService scheduler = new TaskSchedulerClass();
    scheduler.Connect(null, null, null, null);
    
    ITaskFolder rootFolder = scheduler.GetFolder("\\");
    ITaskFolder folder = rootFolder.GetFolders(0).Cast<ITaskFolder>().FirstOrDefault(
        f => f.Name == "Windows7Course");
    
    if (folder == null)
    {
        folder = rootFolder.CreateFolder("Windows7Course", null);
    }
    
    ITaskDefinition task = scheduler.NewTask(0);
    IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
    
    action.Path = typeof(SayHello.Form1).Assembly.Location;
    action.WorkingDirectory = Path.GetDirectoryName(typeof(SayHello.Form1).Assembly.Location);
    
    ISessionStateChangeTrigger trigger = (ISessionStateChangeTrigger)task.Triggers.Create(
        _TASK_TRIGGER_TYPE2.TASK_TRIGGER_SESSION_STATE_CHANGE);
    
    trigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_SESSION_UNLOCK;
    
    task.Settings.DisallowStartIfOnBatteries = true;
    
    task.RegistrationInfo.Author = "Kate Gregory";
    task.RegistrationInfo.Description = "Launches a greeting.";
    
    IRegisteredTask ticket = folder.RegisterTaskDefinition(
        "GreetReturningUser", 
        task, 
        (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, 
        null, 
        null, 
        _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, 
        null);
    

    此特定示例运行同一解决方案(另一个项目)中的 exe。您必须调整 Action.Path、Action.WorkingDirectory 等以满足您的需求。

    【讨论】:

    • 这是一个好的开始。但是,CodePlex.com 中有一个用于任务计划程序的托管包装器,这使它变得更加容易。 taskscheduler.codeplex.com
    【解决方案3】:

    感谢 Kate 提供的出色示例,我很遗憾在我的漫游中没有首先看到您的代码。

    我在通过 c# 代码注册计划任务方面玩得很开心,不出所料,我不得不调整我的计划创建代码,因为我在一个环境中遇到了以前从未遇到过的障碍。我希望我已经获得了最强大的代码,并认为如果我分享一些您在遇到环境问题时可能会尝试的事情,它也可能对其他人有益:

    • 将可执行文件的路径放在双引号中
    • 不要将工作文件夹放在引号中
    • 创建任务后,如果进行后续更改,请调用 ask.RegisterChanges(); - 可能值得设置 task.Definition.Principal.RunLevel = TaskRunLevel.Highest;
    • 我通常默认使用系统帐户来运行任务,但在某些网络环境中,我遇到了一些我无法理解但能够通过提供用户帐户来运行任务来解决的问题。李>

    一切顺利 马特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2012-07-13
      • 2012-03-23
      • 2014-06-06
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多