Как я могу запланировать задачи в приложении WinForms?

ВОПРОС: Как я могу запланировать задачи в приложении WinForms? Это любой (a), что является лучшим подходом / классы/методы.NET к использованию (b), если существует компонент с открытым исходным кодом, который делает это хорошо, которое был бы рекомендован.

ФОН:

  • Приложение Winforms (.NET v3.5, C#, VS2008)
  • Я предполагаю, что буду всегда запускать приложение winforms и просто минимизировать к системному лотку, если не используемому
  • Хочу простой подход (не хотел входить в отдельный сервис, запускающий, с которым приложение winforms UI говорит и т.д.),
  • Хочу смочь позволить пользователю выбрать, как часто запланировать синхронизацию (например, каждый час, ежедневно - время выбора, и т.д.)
  • Способность к во времена, когда планировщик стреляет для выполнения блока кода (принимают это, могла быть перенесена как backgroundworker задача, например),
  • Приложение всегда работает и появляется в системном лотке
6
задан John Saunders 22 March 2010 в 04:18
поделиться

3 ответа

Если вам не нужна служба 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 - это обертка с открытым исходным кодом, которую вы можете попробовать.

2
ответ дан 8 December 2019 в 18:34
поделиться

На самом деле существует нечто, встроенное непосредственно в 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 никогда не работала у меня, всегда сбивая приложение. Я рекомендую не использовать его; обычно он не имеет большого значения.

На странице статьи есть больше примеров кода , некоторые из которых показывают, как изменить настройки задачи, перечислить все запланированные задачи и т.д.

10
ответ дан 8 December 2019 в 18:34
поделиться

Значит, вы хотите запускать задачи, которые представляют собой предопределенный код в вашем приложении, а не внешние exes?

  • Создайте приложение winforms со значком на панели задач. Если вы выполняете развертывание с помощью однократного щелчка, сделайте имя издателя «Автозагрузка», чтобы ярлык устанавливался в каталоге автозагрузки.

  • Используйте таймер для проверки расписания и при необходимости запускайте потоки. Сохраните локальное расписание в файле XML, чтобы его можно было легко запрашивать с помощью LINQ.

  • Вы выполняете свои задачи с помощью фонового рабочего, поэтому потоки уже используются.

Если вы хотите использовать планировщик задач Windows, для него есть API. Не изящный модуль, но работает достаточно хорошо.

1
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: