ВОПРОС: Как я могу запланировать задачи в приложении WinForms? Это любой (a), что является лучшим подходом / классы/методы.NET к использованию (b), если существует компонент с открытым исходным кодом, который делает это хорошо, которое был бы рекомендован.
ФОН:
Если вам не нужна служба Windows, то можно запустить приложение с помощью windows. Для этого можно использовать следующий код.
Dim regKey As RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
regKey.SetValue(Application.ProductName, Application.ExecutablePath)
regKey.Close()
Что вы имели в виду под расписанием синхронизации? Это служба diff? Тогда вы можете использовать таймер, а затем хранить пользовательские настройки в xml-файле или БД. Если вам нужно простое хранилище, то можно использовать My.Settings.
Edit: Я думаю, что единственный способ - это проверять дату при запуске приложения и затем периодически проверять дату. Другой вариант - использовать планировщик задач программно. Task Scheduler Managed Wrapper - это обертка с открытым исходным кодом, которую вы можете попробовать.
На самом деле существует нечто, встроенное непосредственно в Windows, что позволяет сделать именно это. Это называется Планировщик задач Windows! Вместо того чтобы иметь приложение Windows, которое сидит и ждет подходящего момента для запуска части кода, лучше просто использовать базовую системную утилиту и хранить часть кода для запуска в отдельном исполняемом файле: это проще и эффективнее.
Я уже использовал планировщик задач, чтобы настроить свои приложения на запуск по довольно определенному расписанию. Лучший способ сделать это из приложения .NET - использовать эту маленькую удобную библиотеку.
В принципе, чтобы выполнить то, что вы указали в своем вопросе, вам нужно сделать приложение Windows, которое предоставляет графический интерфейс. Этот GUI должен иметь опции, которые регулируют создание и изменение задачи. Задача должна запускать код, который вы должны выполнить (вы должны хранить его в отдельном исполняемом файле, возможно, как WinForms приложение, которое прозрачно и, таким образом, скрыто)
Вот некоторый код из статьи CodeProject самой библиотеки, который иллюстрирует, как создать задачу:
//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
никогда не работала у меня, всегда сбивая приложение. Я рекомендую не использовать его; обычно он не имеет большого значения.
На странице статьи есть больше примеров кода , некоторые из которых показывают, как изменить настройки задачи, перечислить все запланированные задачи и т.д.
Значит, вы хотите запускать задачи, которые представляют собой предопределенный код в вашем приложении, а не внешние exes?
Создайте приложение winforms со значком на панели задач. Если вы выполняете развертывание с помощью однократного щелчка, сделайте имя издателя «Автозагрузка», чтобы ярлык устанавливался в каталоге автозагрузки.
Используйте таймер для проверки расписания и при необходимости запускайте потоки. Сохраните локальное расписание в файле XML, чтобы его можно было легко запрашивать с помощью LINQ.
Вы выполняете свои задачи с помощью фонового рабочего, поэтому потоки уже используются.
Если вы хотите использовать планировщик задач Windows, для него есть API. Не изящный модуль, но работает достаточно хорошо.