Windows .NET上的Task Scheduler的问题

拉希尔·汗(Raheel Khan)

我正在使用https://taskscheduler.codeplex.com/Task Scheduler Managed Wrapper在Windows 7上构建一个针对.NET 4的应用程序,该应用程序在删除了自己创建的所有旧任务后会创建多个任务。

任务注册似乎成功了,但是任务没有启动并且以某种方式破坏了Task Scheduler以下内容:

任务计划程序错误

图像中的错误对话框会弹出六次,这是我的应用删除然后重新创建的任务数。Task Scheduler MMC Console如果首次启动if以及House of Synergy选择文件夹时,都会发生这种情况

该代码有点冗长,但是有必要并且可以进行编译:

namespace TaskSchedulerHelper
{
    using System;
    using System.Diagnostics;
    using System.Linq;
    using System.Security.Principal;
    using System.Windows.Forms;
    using Microsoft.Win32.TaskScheduler;

    internal static class Program
    {
        [STAThread]
        private static void Main (string [] args)
        {
            var now = DateTime.Now;
            var folderName = @"House of Synergy";
            var taskNamePrefix = @"ShutDown Power Outage";
            var applicationName = @"Task Scheduler Helper";

            var times = new TimeSpan []
            {
                TimeSpan.FromHours(02), // 02:00 AM
                TimeSpan.FromHours(06), // 06:00 AM
                TimeSpan.FromHours(11), // 11:00 AM
                TimeSpan.FromHours(15), // 03:00 PM
                TimeSpan.FromHours(19), // 07:00 PM
                TimeSpan.FromHours(23), // 11:00 PM
            };

            try
            {
                Console.Title = applicationName;

                Console.WriteLine(applicationName);
                Console.WriteLine();

                // Uses the Task Scheduler Managed Wrapper
                //  from https://taskscheduler.codeplex.com/.
                //  Release: 2.3.0. Status: Stable.
                //  Date: Thu Dec 18, 2014 at 12:00 PM.
                using (TaskService service = new TaskService())
                {
                    var folder = service
                        .RootFolder
                        .SubFolders
                        .FirstOrDefault(f => (string.Compare(f.Name, folderName, StringComparison.InvariantCultureIgnoreCase) == 0));

                    if (folder == null) { folder = service.RootFolder.CreateFolder(folderName); }

                    var tasks = folder
                        .Tasks
                        //.Where(t => t.Name.StartsWith(taskNamePrefix, StringComparison.InvariantCultureIgnoreCase))
                        .ToList();

                    if (tasks.Any())
                    {
                        // Delete existing tasks.
                        Console.WriteLine("Deleting existing tasks.");
                        foreach (var task in tasks)
                        {
                            Console.Write(" - Deleting Task: {0}: ", task.Name);

                            try
                            {
                                task.Stop();

                                //task.Enabled = false; // Throws ComException: Element not found. (Exception from HRESULT: 0x80070490).
                                //Console.WriteLine(task.State); // Throws ComException: Element not found. (Exception from HRESULT: 0x80070490).

                                task.RegisterChanges();
                                folder.DeleteTask(task.Name, false);
                                task.Dispose();

                                Console.WriteLine("Done.");
                            }
                            catch (Exception exception)
                            {
                                Console.WriteLine("Exception: {0}.", exception);
                            }
                        }
                    }

                    Console.WriteLine();
                    Console.WriteLine("Creating new Tasks.");

                    foreach (var time in times)
                    {
                        var dateTimeNow = now.Date;
                        var definition = service.NewTask();
                        var dateTimeTrigger = now.Date.Add(time);
                        var taskName = taskNamePrefix + " " + dateTimeTrigger.ToString(@"hh-mm tt");

                        Console.Write(" - Creating Task: {0}: ", taskName);

                        try
                        {
                            definition.RegistrationInfo.Author = WindowsIdentity.GetCurrent().Name;
                            definition.RegistrationInfo.Date = DateTime.Now;
                            definition.RegistrationInfo.Description = "ShutDown event due to power outage at [" + dateTimeTrigger.ToLongTimeString() + "].";
                            definition.RegistrationInfo.Source = applicationName;
                            definition.RegistrationInfo.Version = new Version(1, 0, 0, 0);

                            definition.Settings.AllowDemandStart = true;
                            definition.Settings.AllowHardTerminate = false;
                            definition.Settings.Compatibility = TaskCompatibility.V2_1; // Windows 7 and above.
                            definition.Settings.DisallowStartIfOnBatteries = false;
                            definition.Settings.DisallowStartOnRemoteAppSession = false;
                            definition.Settings.Enabled = true;
                            definition.Settings.Hidden = false;
                            definition.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
                            definition.Settings.Priority = ProcessPriorityClass.High;
                            definition.Settings.RestartCount = 10;
                            definition.Settings.RestartInterval = TimeSpan.FromMinutes(1);
                            definition.Settings.RunOnlyIfIdle = false;
                            definition.Settings.RunOnlyIfNetworkAvailable = false;
                            definition.Settings.StartWhenAvailable = true;
                            definition.Settings.StopIfGoingOnBatteries = false;
                            definition.Settings.UseUnifiedSchedulingEngine = true;
                            definition.Settings.WakeToRun = false;

                            definition.Actions.Add(new ShowMessageAction("Message Body", "Message Title"));
                            definition.Triggers.Add(new DailyTrigger() { StartBoundary = dateTimeTrigger.Subtract(TimeSpan.FromMinutes(10)), });

                            var task = folder.RegisterTaskDefinition(taskName, definition);

                            task.Enabled = true;
                            task.RegisterChanges();
                            // Always succeeds.
                            Console.WriteLine("Done.");

                            try
                            {
                                Console.WriteLine("   - Task Validation: ", task.Definition.Validate(throwException : true) ? "Succeeded." : "Failed.");
                            }
                            catch (Exception exception)
                            {
                                // Validation always fails.
                                Console.WriteLine("   - Task Validation Exception: {0}.", exception);
                            }
                        }
                        catch (Exception exception)
                        {
                            Console.WriteLine("Exception: {0}.", exception.Message);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Console.Write(exception);
            }

            Console.WriteLine();
            Console.WriteLine();
            Console.Write("Press any key to continue...");
            Console.ReadKey(true);
        }
    }
}
拉希尔·汗(Raheel Khan)

注释掉task.RegisterChanges();,随后的两行似乎可以解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

虚拟Windows Server上的Java Scheduler执行程序计时问题

使用Windows Task Scheduler运行批处理文件

Windows Task Scheduler无法运行VBScript

WebApi中的Windows Task Scheduler或TaskService函数

如何从Windows Task Scheduler在(ubuntu bash Windows 10)上运行程序

如何使用Windows Task Scheduler执行.Net Core 2.0 Console App?

通过Windows Task Scheduler在C#中以静默方式打印到Adobe Reader DC的问题

Windows Task Scheduler不会在非系统驱动器上运行文件

通过Windows Task Scheduler运行Powershell脚本

在Windows Task Scheduler(Windows 7)中运行Powershell脚本

为什么我的任务总是在Windows 2008 Task Scheduler上运行

Windows Task Scheduler Winlogon事件-注销不足(?)

在Windows Task Scheduler上进行计划

Windows Task Scheduler图表?

Windows Task Scheduler上的文件更改

在Windows 8上使用Task Scheduler计划每小时进行一次静默的Windows Defender定义更新

Windows Task Scheduler的“模拟”触发器

使Windows Task Scheduler在失败时提醒我

自定义Windows Task Scheduler

使用Windows Task Scheduler解锁PC

Windows Task Scheduler未在事件上运行任务

如何在Windows Task Scheduler中捕获Internet连接事件?

Windows上的Git问题

Powershell最终阻止在Windows Task Scheduler中不执行

如果启用了计划任务并在远程服务器上运行,则在本地禁用Windows Task Scheduler作业

Windows Server上的Laravel Task Scheduler

Windows Task Scheduler-在空闲触发器上并非始终有效

从Windows Task Scheduler自动运行curl

Laravel Task Scheduler Server 無法在 Windows Server Xampp 上運行