Как я могу запланировать задачи в приложении WinForms? - PullRequest
6 голосов
/ 22 марта 2010

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

Предпосылка:

  • Приложение Winforms (.NET v3.5, C #, VS2008)
  • Я предполагаю, что всегда буду запускать приложение winforms и просто сверну в системный трей, когда он не используется
  • Нужен простой подход (не хотел входить в отдельную службу, с которой взаимодействует пользовательское приложение winforms, и т. Д.)
  • Хотите, чтобы пользователь мог выбирать, как часто планировать синхронизацию (например, ежечасно, ежедневно - время выбора и т. Д.)
  • Возможность при запуске планировщика запускать кусок кода (например, предположим, что он может быть обернут в фоновую задачу)
  • Приложение всегда работает и отображается в системном трее

Ответы [ 3 ]

10 голосов
/ 22 марта 2010

На самом деле есть нечто встроенное в Windows , которое будет делать именно это.Он называется Планировщик заданий Windows !Вместо того, чтобы иметь приложение Windows, которое сидит и ждет нужного времени для запуска фрагмента кода, вам лучше использовать базовую системную утилиту и хранить фрагмент кода для запуска в отдельном исполняемом файле: это проще и более эффективно .

Ранее я использовал планировщик задач, чтобы настроить приложения для запуска по довольно определенному расписанию.Лучший способ сделать это из приложения .NET - это использовать эту удобную маленькую библиотеку .

По сути, чтобы выполнить то, что вы заявили в своем вопросенеобходимо создать приложение для Windows, которое предоставляет графический интерфейс.Этот графический интерфейс должен иметь параметры, которые регулируют создание и изменение задачи.Задача должна запустить код, который вы должны запустить (вы должны хранить его в отдельном исполняемом файле, вероятно, как прозрачное и, следовательно, скрытое приложение 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 никогда не работал для меня, всегда вызывая сбой приложения.Я рекомендую вам оставить это;как правило, это не имеет большого значения.

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

2 голосов
/ 22 марта 2010

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

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

1 голос
/ 22 марта 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...