How can I schedule tasks in a WinForms app?

后端 未结 3 580
情书的邮戳
情书的邮戳 2020-12-16 05:17

QUESTION: How can I schedule tasks in a WinForms app? That is either (a) what is the best approach / .NET classes/methods to use of (b) if there is an open source componen

3条回答
  •  半阙折子戏
    2020-12-16 05:45

    There's actually something directly built into Windows that will do just that. It's called the Windows Task Scheduler! Rather than having a Windows application that sits and waits for the right time to run a piece of code, you'd be better off just using an underlying system utility and storing the piece of code to run in a separate executable: it's easier and more efficient.

    I've used the Task Scheduler before to configure my applications to start on a pretty specific schedule. The best way to do it out of a .NET application is to use this handy little library.

    Basically, to accomplish what you've stated in your question, you need to make a Windows application that provides a GUI. This GUI should have options that regulate the creation and alteration of a Task. The Task should launch the code you have to run (you should store it in a separate executable, probably as a WinForms app that's transparent and, thus, hidden.)

    Here's some code from the CodeProject article of the library itself that illustrates how to create a task:

    //Get a ScheduledTasks object for the local computer.
    ScheduledTasks st = new ScheduledTasks();
    
    // Create a task
    Task t;
    try {
        t = st.CreateTask("D checker");
    } catch (ArgumentException) {
        Console.WriteLine("Task name already exists");
        return;
    }
    
    // Fill in the program info
    t.ApplicationName = "chkdsk.exe";
    t.Parameters = "d: /f";
    t.Comment = "Checks and fixes errors on D: drive";
    
    // Set the account under which the task should run.
    t.SetAccountInformation(@"THEDOMAIN\TheUser", "HisPasswd");
    
    // Declare that the system must have been idle for ten minutes before 
    // the task will start
    t.IdleWaitMinutes = 10;
    
    // Allow the task to run for no more than 2 hours, 30 minutes.
    t.MaxRunTime = new TimeSpan(2, 30, 0);
    
    // Set priority to only run when system is idle.
    t.Priority = System.Diagnostics.ProcessPriorityClass.Idle;
    
    // Create a trigger to start the task every Sunday at 6:30 AM.
    t.Triggers.Add(new WeeklyTrigger(6, 30, DaysOfTheWeek.Sunday));
    
    // Save the changes that have been made.
    t.Save();
    // Close the task to release its COM resources.
    t.Close();
    // Dispose the ScheduledTasks to release its COM resources.
    st.Dispose();
    

    NOTE: The priority option never worked for me, always crashing the app. I recommend you leave it out; usually, it doesn't make that big a difference.

    There are more code samples on the article page, some of which show how to change the settings of a Task, list all Scheduled Tasks, etc.

提交回复
热议问题