Как запустить программу через время

В Windows есть механизм под названием ‘Планировщик заданий’ (Task Scheduler). Основная задача планировщика — выполнение задач в определенный момент времени или при определенном действии. В этой статье будет рассмотрены варианты работы с ним через Powershell. На примере мы создадим задание в виде скрипта с Powershell, изменим и удалим его используя только команды.

  • 1 Работа планировщика в Powershell
  • 1.1 Создание скрипта для тестирования
  • 6.1 Изменение триггеров и действий
  • 7.1 Резервное копирование
  • 7.2 Удаление, отключение и включение
  • 7.3 Восстановление

Работа планировщика в Powershell

Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:

  1. Action (Действие) — определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
  2. Trigger (Триггер) — это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное — каждые 2 часа. Так же как и действий триггеров может быть несколько.
  3. Settings (Настройки) — дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
  4. Security Options (Параметры безопасности) — определяют привилегии и пользователя от имени которого будут запущены задания.

Как узнать время запуска любой программы на компьютере

3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.

За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:

Источник: darksf.ru

Как вызвать метод ежедневно, в определенное время, в C #?

Я хочу более эффективный способ сделать это, нет необходимости постоянно проверять время, и у меня есть контроль над тем, выполнено ли задание. Если метод выходит из строя (из-за каких-либо проблем), программа должна знать, чтобы писать для регистрации/отправки электронной почты. Вот почему мне нужно вызвать метод, а не планировать задание.

Я нашел это решение вызов метода в фиксированное время в Java на Java. Есть ли аналогичный способ в С#?

EDIT: Я сделал это. Я добавил параметр в void Main() и создал bat (запланированный планировщиком задач Windows) для запуска программы с этим параметром. Программа запускается, выполняет задание и затем выходит. Если сбой задания, он способен записывать журнал и отправлять электронную почту. Этот подход хорошо соответствует моим требованиям:)

Как запретить запуск игр, программ и сайтов по расписанию?

Vimvq1987 14 июль 2010, в 06:32
Поделиться

Этот связанный вопрос, кажется, указывает на то, что метод в вашем запущенном приложении должен периодически вызываться. Это тот случай? Это повлияет на то, нужно ли вам планировать в процессе или вы можете просто использовать планировщик Windows.

Читайте также:
Знания ценности программы действия примеры взаимосвязи

paxdiablo 14 июль 2010, в 04:21
моя программа будет работать в соответствии с требованиями постоянно
Vimvq1987 14 июль 2010, в 04:24
Эй, я не могу поверить, что ты назвал мой ответ «некрасивым». Их воюют слова 🙂
paxdiablo 14 июль 2010, в 04:39
Не имел в виду ваш ответ: с. Я тоже думал об этом, и нашел себя уродливым.
Vimvq1987 14 июль 2010, в 04:41

PaulB 14 июль 2010, в 06:12
Показать ещё 3 комментария
Поделиться:
scheduled-tasks

14 ответов

Лучший ответ

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

Это действительно все, что вам нужно!

Обновление:, если вы хотите сделать это внутри своего приложения, у вас есть несколько вариантов:

  • в приложении Windows Forms, вы можете нажать на Application.Idle и проверить, хотите ли вы «Я достиг времени, чтобы вызвать ваш метод. Этот метод вызывается только тогда, когда ваше приложение не занято другими вещами. Быстрая проверка, чтобы узнать, достигнуто ли ваше целевое время, не стоит слишком сильно нажимать на ваше приложение, я думаю.
  • в веб-приложении ASP.NET существуют методы «имитировать» отправку запланированных событий — ознакомьтесь с этой статьей CodeProject
  • и, конечно же, вы можете просто просто «сворачивать свои собственные» в любом приложении .NET — посмотрите эту статью CodeProject для образца реализация

Обновить # 2: если вы хотите проверять каждые 60 минут, вы можете создать таймер, который просыпается каждые 60 минут, и если время наступает, он вызывает метод.

Что-то вроде этого:

using System.Timers; const double interval60Minutes = 60 * 60 * 1000; // milliseconds to one hour Timer checkForTime = new Timer(interval60Minutes); checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed); checkForTime.Enabled = true;

а затем в обработчике событий:

void checkForTime_Elapsed(object sender, ElapsedEventArgs e) < if (timeIsReady()) < SendEmail(); >>
marc_s 14 июль 2010, в 05:31
Поделиться

Думал об этом раньше. :). Но моя программа будет работать непрерывно, и я хочу знать альтернативный путь, если таковой имеется 🙂

Vimvq1987 14 июль 2010, в 04:23

это приложение Winform. Я постараюсь убедить моего босса изменить его дизайн, но сначала я должен попытаться выполнить его требования: p

Vimvq1987 14 июль 2010, в 04:25
Спасибо за ваш ответ. Я добавил немного информации. Я очень признателен, если вы можете помочь .
Vimvq1987 14 июль 2010, в 04:37
marc_s 14 июль 2010, в 04:55
Что делает timeIsReady() ?
brimble2010 23 фев.

2015, в 14:28
marc_s 23 фев. 2015, в 14:33
brimble2010 23 фев. 2015, в 14:55
Показать ещё 5 комментариев

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

Пожалуйста, см. мой ответ на аналогичный вопрос для примера кода и дополнительных пояснений.

Читайте также:
По какому обязательному признаку название вирус было отнесено к компьютерным программам

Maxim Zaslavsky 14 июль 2010, в 06:30
Поделиться

Как говорили другие, вы можете использовать консольное приложение для запуска по расписанию. То, что другие не сказали, — это то, что вы можете запустить это приложение через EventWaitHandle, который вы ожидаете в своем основном приложении.

Консольное приложение:

class Program < static void Main(string[] args) < EventWaitHandle handle = new EventWaitHandle(true, EventResetMode.ManualReset, «GoodMutexName»); handle.Set(); >>

Главное приложение:

private void Form1_Load(object sender, EventArgs e) < // Background thread, will die with application ThreadPool.QueueUserWorkItem((dumby) =>EmailWait()); > private void EmailWait() < EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset, «GoodMutexName»); while (true) < handle.WaitOne(); SendEmail(); handle.Reset(); >>
Courtney D 14 июль 2010, в 06:10
Поделиться

Я создал простой планировщик, который прост в использовании, и вам не нужно использовать внешнюю библиотеку.

TaskScheduler — это синглтон, который хранит ссылки на таймеры, поэтому таймеры не будут собирать мусор, он может планировать несколько задач. Вы можете установить первый запуск (час и минута), если на момент составления графика это время закончится, когда начнется планирование на следующий день в это время. Но легко настроить код.

Планирование новой задачи так просто. Пример: в 11:52 первая задача — на каждые 15 секунд, второй пример — на каждые 5 секунд. Для ежедневного выполнения установите 24 для параметра 3.

TaskScheduler.Instance.ScheduleTask(11, 52, 0.00417, () => < Debug.WriteLine(«task1: » + DateTime.Now); //here write the code that you want to schedule >); TaskScheduler.Instance.ScheduleTask(11, 52, 0.00139, () => < Debug.WriteLine(«task2: » + DateTime.Now); //here write the code that you want to schedule >);

Мое окно отладки:

task2: 07.06.2017 11:52:00 task1: 07.06.2017 11:52:00 task2: 07.06.2017 11:52:05 task2: 07.06.2017 11:52:10 task1: 07.06.2017 11:52:15 task2: 07.06.2017 11:52:15 task2: 07.06.2017 11:52:20 task2: 07.06.2017 11:52:25 .

Просто добавьте этот класс в свой проект:

public class TaskScheduler < private static TaskScheduler _instance; private Listtimers = new List(); private TaskScheduler() < >public static TaskScheduler Instance => _instance ?? (_instance = new TaskScheduler()); public void ScheduleTask(int hour, int min, double intervalInHour, Action task) < DateTime now = DateTime.Now; DateTime firstRun = new DateTime(now.Year, now.Month, now.Day, hour, min, 0, 0); if (now >firstRun) < firstRun = firstRun.AddDays(1); >TimeSpan timeToGo = firstRun — now; if (timeToGo var timer = new Timer(x => < task.Invoke(); >, null, timeToGo, TimeSpan.FromHours(intervalInHour)); timers.Add(timer); > >
jannagy02 07 июнь 2017, в 10:47
Поделиться

Новый таймер не имеет метода, который принимает 4 аргумента.
Fandango68 24 апр. 2018, в 04:41

Я полагаю, Таймер здесь от System.Timers? Не могли бы вы предоставить пример рабочей программы? Спасибо

Fandango68 24 апр. 2018, в 04:55
jannagy02 24 апр. 2018, в 08:38
Показать ещё 1 комментарий

Я знаю, что это устарело, но как насчет этого:

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

Читайте также:
Какой программой открыть файл msg на компьютере

mansoor 17 нояб. 2011, в 17:50
Поделиться
И смотреть, как он терпит неудачу во время изменений летнего времени. , ,
Jim Mischel 14 март 2013, в 20:49
Хороший вопрос, хотя это можно компенсировать.

Brent 12 март 2014, в 14:14

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

Pieter Germishuys 14 июль 2010, в 04:36
Поделиться

Здесь можно сделать это с помощью TPL. Нет необходимости создавать/удалять таймер и т.д.:

void ScheduleSomething() < var runAt = DateTime.Today + TimeSpan.FromHours(16); if (runAt else < var delay = runAt — DateTime.Now; System.Threading.Tasks.Task.Delay(delay).ContinueWith(_ =>DoSomething()); > > void DoSomething() < // do somethig >
Gino 28 нояб. 2017, в 03:30
Поделиться

Это может быть только я, но казалось, что большинство из этих ответов не были полными или не будут работать правильно. Я сделал что-то очень быстрое и грязное.

Это, как говорится, не уверен, насколько хорошо идея заключается в том, чтобы делать это таким образом, но она отлично работает каждый раз.

while (true) < if(DateTime.Now.ToString(«HH:mm») == «22:00») < //do something here //ExecuteFunctionTask(); //Make sure it doesn’t execute twice by pausing 61 seconds. So that the time is past 2200 to 2201 Thread.Sleep(61000); >Thread.Sleep(10000); >
Deathstalker 16 дек. 2016, в 22:31
Поделиться

Насколько я понимаю, это будет напряженное ожидание и, следовательно, не очень хорошая идея. en.wikipedia.org/wiki/Busy_waiting

Tommy Ivarsson 05 апр. 2018, в 09:10

Недавно я написал приложение С#, которое пришлось перезапускать ежедневно. Я понимаю, что этот вопрос старый, но я не думаю, что больно добавлять еще одно возможное решение. Так я обрабатывал ежедневные перезагрузки в указанное время.

public void RestartApp() < AppRestart = AppRestart.AddHours(5); AppRestart = AppRestart.AddMinutes(30); DateTime current = DateTime.Now; if (current >AppRestart) < AppRestart = AppRestart.AddDays(1); >TimeSpan UntilRestart = AppRestart — current; int MSUntilRestart = Convert.ToInt32(UntilRestart.TotalMilliseconds); tmrRestart.Interval = MSUntilRestart; tmrRestart.Elapsed += tmrRestart_Elapsed; tmrRestart.Start(); >

Чтобы гарантировать, что ваш таймер хранится в области видимости, я рекомендую создать его вне метода, используя метод System.Timers.Timer tmrRestart = new System.Timers.Timer() . Поместите метод RestartApp() в событие загрузки формы.

Когда приложение запустится, будут установлены значения для AppRestart , если current больше, чем время перезапуска, мы добавляем 1 день до AppRestart , чтобы гарантировать, что перезапуск произойдет вовремя и что мы не получаем исключения для отрицательное значение в таймер. В событии tmrRestart_Elapsed запускается любой код, который вам нужен, в указанное время. Если ваше приложение перезапустится самостоятельно, вам необязательно останавливать таймер, но это тоже не повредит. Если приложение не перезапускается, просто вызовите метод RestartApp() еще раз, и вам будет хорошо идти.

Источник: overcoder.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru