如何在WinForms应用程序中安排任务?

时间:2010-03-22 04:15:36

标签: .net winforms .net-3.5 scheduling

问题:如何在WinForms应用程序中安排任务?这是(a)使用(b)的最佳方法/ .NET类/方法是什么,如果有一个开源组件做得好,建议使用哪一个。

背景:

  • Winforms app(.NET v3.5,C#,VS2008)
  • 我假设我将始终运行winforms应用程序,并且在不使用时最小化到系统托盘
  • 想要一个简单的方法(不想进入运行UI winforms app会话的单独服务等)
  • 希望能让用户选择安排同步的频率(例如每小时,每日 - 选择时间等)
  • 能够在调度程序激活时运行一大块代码(例如,假设它可以作为后台工作任务包装)
  • 应用程序始终在运行&出现在系统托盘中

3 个答案:

答案 0 :(得分:10)

实际上直接构建到Windows中的东西就可以做到这一点。它被称为 Windows任务计划程序!您可以更好地使用底层系统实用程序并将代码段存储在单独的可执行文件中运行,而不是让Windows应用程序等待正确的时间来运行一段代码:它是更容易更高效

我之前使用过任务计划程序来配置我的应用程序以非常具体的计划启动。从.NET应用程序中执行此操作的最佳方法是使用this handy little library

基本上,要完成您在问题中所述的内容,您需要创建一个提供GUI的Windows应用程序。此GUI应具有调节任务的创建和更改的选项。任务应该启动你必须运行的代码(你应该将它存储在一个单独的可执行文件中,可能作为一个透明的WinForms应用程序,因此被隐藏。)

以下是一些代码from the CodeProject article of the library itself,说明了如何创建任务:

//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();

注意:priority选项对我来说从不起作用,总是会崩溃应用程序。我建议你把它留下来;通常,它没有那么大的差异。

还有更多代码示例on the article page,其中一些示例显示如何更改任务的设置,列出所有计划任务等。

答案 1 :(得分:2)

如果您不想要Windows服务,那么可以选择使用Windows i启动应用程序。您可以使用以下代码来执行此操作。

Dim regKey As RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
regKey.SetValue(Application.ProductName, Application.ExecutablePath)
regKey.Close()

通过安排同步是什么意思?这是差异化的服务吗?然后,您可以使用计时器,然后将用户设置存储在xml文件或数据库中。如果您想要一个简单的存储空间,那么您可以使用My.Settings

编辑:我认为唯一的方法是检查应用程序启动的日期,然后定期检查日期。另一种选择是以编程方式使用任务调度程序。 Task Scheduler Managed Wrapper是一个开源包装器,您可以尝试。

答案 2 :(得分:1)

因此,您希望在应用中运行预定义代码而不是外部代码?

  • 制作带有系统托盘图标的winforms应用程序。如果使用单击一次进行部署,请将发布者名称设置为“启动”,以便在启动目录中安装快捷方式。

  • 使用计时器检查计划并根据需要启动线程。将本地计划存储在XML文件中,以便可以使用LINQ轻松查询。

  • 您正在使用后台工作程序运行任务,因此线程已在使用中。

但是,如果您想使用Windows任务计划程序,则可以使用它。不是一个优雅的模块,但它运作良好。