簡體   English   中英

.NET上Windows上的Task Scheduler的問題

[英]Issues with Task Scheduler on Windows from .NET

我正在使用https://taskscheduler.codeplex.com/上的Task Scheduler Managed Wrapper ,在Windows 7上構建一個針對.NET 4的應用程序,該應用程序在刪除了自己創建的所有舊任務后會創建多個任務。

任務注冊似乎成功了,但是任務沒有啟動,並且以某種方式損壞了Task Scheduler ,如下所示:

任務計划程序錯誤

圖像中的錯誤對話框彈出六次,這是我的應用刪除然后重新創建的任務數。 第一次啟動Task Scheduler MMC Console時,以及在選擇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);
        }
    }
}

注釋掉task.RegisterChanges(); 之后的兩行似乎可以解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM