button1_Click Форма Windows С# создать задачу планировщика

У меня есть приложение формы Windows в С# Visual Studio 2012 с кнопкой button_click. То, что я пытаюсь сделать, это следующее. Приложение работает нормально, всякий раз, когда я нажимаю на кнопку, приложение делает то, что я должен делать. Проблема в том, что мне нужно делать это ежедневно, и я не собираюсь вручную нажимать кнопку самостоятельно. Есть способ автоматически поставить расписание, чтобы кнопка автоматически запускалась ежедневно? поэтому я оставлю приложение открытым все время, чтобы каждый день в определенное время нажималась кнопка.

Заранее большое спасибо.


person Benjamin Arancibia    schedule 05.12.2014    source источник
comment
Создайте консольное приложение, которое запускается по расписанию Windows, или создайте службу Windows, которая использует Quartz для выполнения задания.   -  person L-Four    schedule 05.12.2014


Ответы (3)


Что вам нужно сделать, так это централизовать код обработчика событий в нечто вроде библиотеки классов. Тогда ваш обработчик событий может просто вызвать этот централизованный метод. Сделав это, вы можете создать консольное приложение или службу Windows, например L-Three, предложенную выше.

// Event handler
private void button1_Click(object sender, EventArgs args)
{
      LibraryClass.DoStuff(...); // Pass whatever parameters might be needed
}

// In a separate project
public class LibraryClass
{
      public static void DoStuff(...)
      {
            // Move the code from your event handler here
      }
}

// In a console app
class Program
{
      static void Main(string [] args)
      {
            LibraryClass.DoStuff(...);  // pass whatever parameters are needed
      }
}
person YtramX    schedule 05.12.2014
comment
Привет, спасибо за ваш ответ, это означает, что это нельзя сделать с формой окна? это будет работать только с консольным приложением? проблема в том, что мое приложение является клиентом веб-службы, и я использую веб-службу. Спасибо - person Benjamin Arancibia; 05.12.2014
comment
Это не единственный способ, которым вы можете это сделать, но я бы настоятельно рекомендовал его, а не любой клудж, связанный с нажатием кнопки в форме на основе какого-то таймера. Также ничто не мешает вам использовать веб-службу из библиотеки классов. И если вы централизуете код в библиотеке классов, вы можете повторно использовать его либо в консольном приложении, либо в winform. - person YtramX; 05.12.2014
comment
@BenjaminArancibia Почему тот факт, что это клиент веб-службы, означает, что вам нужно использовать приложение winform, а не консольное приложение или приложение службы Windows? - person Servy; 05.12.2014
comment
@Servy Привет, когда я создавал, я выбирал форму Windows, но это не обязательно. Я решил сделать это, потому что приложение будет использоваться другими пользователями без навыков программирования. - person Benjamin Arancibia; 05.12.2014
comment
@BenjaminArancibia Тогда это решение именно то, что вы хотите сделать; выполните бизнес-логику в библиотеке классов и предоставьте для нее несколько пользовательских интерфейсов, один из которых легко автоматизируется, а другой может использоваться людьми. - person Servy; 05.12.2014
comment
Опять же, как я уже упоминал, вам не придется делать выбор между консольным приложением или приложением winform. Вы по-прежнему можете сохранить приложение winform и просто использовать консольное приложение для запланированных задач. Если вы централизуете код, вы можете заставить его работать одинаково независимо от клиента. - person YtramX; 05.12.2014
comment
Хорошо, теперь я понял. Я попытаюсь сделать это с помощью консоли, я никогда раньше не пробовал, но, похоже, это хорошее решение. Спасибо еще раз - person Benjamin Arancibia; 05.12.2014

Используйте таймер с интервалом 1000 и проверьте, не изменилась ли текущая дата. Затем сделайте «нажатие кнопки».

person elite    schedule 05.12.2014
comment
Это чрезвычайно ненадежно, и это не очень хороший способ автоматизировать что-то подобное для чего-то, что работает в течение такого длительного периода времени. Это означает, что код должен работать 24 часа в сутки, 7 дней в неделю, а не только тогда, когда у него есть работа (что означает потребление системных ресурсов в течение всего этого времени), перезагрузка компьютера испортит его, пользователь может довольно легко непреднамеренно закрыть его и т. д. , И это не говоря уже обо всех проблемах с датой и временем. Что происходит, например, когда кто-то меняет системные часы. - person Servy; 05.12.2014
comment
Обычно это делается не так. - person L-Four; 05.12.2014

Здравствуйте, Бенджамин Арансибия, вы можете сделать это следующим образом:

В его App.config добавьте переменные, чтобы контролировать, когда задача будет выполняться.

<appSettings>    
    <add key="executeDailyService" value="true"/>
    <add key="dailyServiceTime" value="08:00-18:00"/>
    <add key="dailyServiceInterval" value="1"/>
</appSettings>

executeDailyService = Опция, указывающая, будет ли задача выполняться каждый день dailyServiceTime = Опция для указания периода, в течение которого она может выполняться, здесь можно настроить, например: 13:00-14:00 dailyServiceInterval = Опция, указывающая диапазон дней, в которые будет выполняться задача например:. 1 = каждый день, 2 = через день ... п

При запуске приложения запустите следующий метод:

private void startTimer()
{
    // Loads the variables that will be used
    var executeDailyService = ConfigurationManager.AppSettings["executeDailyService"];
    var dailyServiceTime = ConfigurationManager.AppSettings["dailyServiceTime"];
    var dailyServiceInterval = ConfigurationManager.AppSettings["dailyServiceInterval"];
    // Validates that the variables are loaded
    if (executeDailyService != "true" || String.IsNullOrEmpty(dailyServiceTime) || String.IsNullOrEmpty(dailyServiceInterval))
        return;

    // Timer that controls the automatic execution of code
    var timer = new Timer();
    timer.Interval = Convert.ToInt32(dailyServiceInterval) * 60 * 1000; // Calculates how often will run your code
    timer.Elapsed += new ElapsedEventHandler(services);
    timer.Start();
}

private void services(object sender, ElapsedEventArgs e)
{
    // Loads of the variable time period
    var dailyServiceTime = ConfigurationManager.AppSettings["dailyServiceTime"];
    // Validates the contents of the variable is in the correct format
    if (String.IsNullOrEmpty(dailyServiceTime) || !dailyServiceTime.IsMatch("^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"))
        return;

    // Calculates whether the current time is within the range you set
    var now = Util.Now();
    var dateBegin = Util.DateTime(now.Year, now.Month, now.Day, Convert.ToInt32(dailyServiceTime.Substring(0, 2)), Convert.ToInt32(dailyServiceTime.Substring(3, 2)), 0);
    var dateEnd = Util.DateTime(now.Year, now.Month, now.Day, Convert.ToInt32(dailyServiceTime.Substring(6, 2)), Convert.ToInt32(dailyServiceTime.Substring(9, 2)), 0);
    if (dateBegin > dateEnd || now < dateBegin || now > dateEnd)
        return;

    var timer = sender as Timer;
    timer.Stop();

    // You code here

    timer.Start();
}
person picossi    schedule 05.12.2014
comment
Это чрезвычайно ненадежно, и это не очень хороший способ автоматизировать что-то подобное для чего-то, что работает в течение такого длительного периода времени. Это означает, что код должен работать 24 часа в сутки, 7 дней в неделю, а не только тогда, когда у него есть работа (что означает потребление системных ресурсов в течение всего этого времени), перезагрузка компьютера испортит его, пользователь может довольно легко непреднамеренно закрыть его и т. д. , И это не говоря уже обо всех проблемах с датой и временем. Что происходит, например, когда кто-то меняет системные часы. - person Servy; 05.12.2014
comment
@Servy полностью с вами не согласен, вы использовали функцию таймера? Эта строка: timer.Interval = Convert.ToInt32(dailyServiceInterval) * 60 * 1000; Заставит ваш код работать только тогда, когда он должен работать, он не будет работать 24/7. Собственный .Net framework имеет этот контроль. Но другой способ сделать это — создать программу консоли управления и поместить код в метод main. Затем добавьте программу в планировщик заданий Windows. - person picossi; 05.12.2014
comment
Процесс будет жить 24/7. Он не будет постоянно активно потреблять ЦП, но его объем памяти будет активен все время, что делает вероятность утечки памяти очень реальной, и это приводит к другим проблемам, о которых я подробно рассказал; что пользователь может легко закрыть его случайно, перезапуск испортит его и т. д. Все это прямые последствия того факта, что на самом деле процесс работает 24/7, а не запланирован ОС через что-то вроде планировщика задач или как оказание услуг. Timer предназначен в первую очередь для более коротких интервалов времени. - person Servy; 05.12.2014
comment
Я согласен с вами, всегда будет активный процесс, но этот процесс является собственным процессом приложения. Использование таймера не создает новых процессов. Единственный процесс, который будет активен во время выполнения или во время остановки, — это приложение. Что касается использования памяти, то ее арендует только приложение. Если вы обрабатываете рутину или спите, потребление памяти не изменится. Короче говоря, память всегда будет сдаваться в аренду одинакового размера, и что изменится, так это обработка, которая будет увеличиваться только тогда, когда процесс активен. - person picossi; 05.12.2014
comment
Было бы чрезвычайно важно прочитать о классе Timer: Класс таймера - person picossi; 05.12.2014
comment
Привет всем и спасибо за все ответы. Я хотел бы знать @picossi, если ваш код мне нужно вставить его в приватную кнопку void button1_Click до и вставить в него приватную кнопку void button1_Click? Благодарность - person Benjamin Arancibia; 05.12.2014
comment
Я знаю, как работает таймер. Ясно, что вы не понимаете последствий использования UI-приложения, работающего круглосуточно и без выходных в пользовательском режиме, когда важно, чтобы пользователь не взаимодействовал/влиял на него каким-либо образом. Приложение, безусловно, будет потреблять память даже при ожидании таймера. Даже если реальная работа регулярно полностью очищается (хотя вы добавляете большой риск того, что это может не произойти), у вас есть весь след пользовательского интерфейса, который стоит и не используется. - person Servy; 05.12.2014
comment
@BenjaminArancibia Вы только настраиваете себя и своих пользователей на мир боли и массу проблем в будущем, делая что-то подобное. Вам действительно нужно потратить время, чтобы вытащить свой пользовательский интерфейс, если вы хотите запустить это как запланированную операцию. - person Servy; 05.12.2014
comment
@BenjaminArancibia Привет, Бенджамин Арансибия, вы должны сделать следующее: код, который находится в вашем методе button1_Click, вы должны поместить в метод, к которому лужа будет доступна с помощью метода button1_Click и других методов. После того, как вы вызовете этот метод в строке с комментарием: // Здесь вы кодируете ... Если хотите, вы можете использовать их как общедоступные методы. Они не обязательно должны быть частными методами. - person picossi; 05.12.2014
comment
@Servy Возможно, это не лучшая практика, но я даю решение его вопроса. Конечно, с этим кодом они получат то, что хотят. Теперь, если это лучший способ, то есть использовать приложение пользовательского интерфейса для автоматизации рутины, это хорошо или плохо, это другой вопрос. Вы должны попытаться внести свой вклад непосредственно в вопрос, а не голосовать отрицательно за предложенные решения. - person picossi; 05.12.2014
comment
@picossi Вы решаете одну проблему и создаете еще 10. ОП в конечном итоге станет хуже, если он в конечном итоге воспользуется вашим решением. Он просто вернется сюда через несколько дней, пытаясь разобраться со всеми проблемами, которые это принесет ему. Не неважно, что это решение чрезвычайно проблематично, и это не следует обсуждать в другом вопросе. Ответы должны не просто отвечать на вопрос, а отвечать на них хорошо. - person Servy; 05.12.2014
comment
@Servy Ничего против тебя. Я посмотрел твой профиль, а ты отличный программист, точно знаешь, что он делает и о чем речь. И я также согласен с вами, что пользовательский интерфейс приложения — не лучший способ оставаться активным 24/7. Но мы должны подумать о следующей ситуации: и если это приложение является устаревшим приложением, которое не окупается за переделку, или если это приложение является только временным, пока у вас не будет другого решения, или если это приложение должно запускать только опасность, а затем больше не будет запускаться. - person picossi; 05.12.2014
comment
@picossi Для начала нет никаких указаний на то, что это устаревшее приложение, но даже если это так, перемещение всего кода, не связанного с пользовательским интерфейсом, из события нажатия кнопки в консольное приложение должно быть очень простым, независимо от размера приложение. Его не нужно переписывать с нуля только для того, чтобы убрать пользовательский интерфейс. Зачем ему прилагать все усилия, чтобы это работало, только для того, чтобы потратить такое же, если не меньшее количество усилий, просто чтобы оно работало должным образом. - person Servy; 05.12.2014
comment
Привет, все, что я понимаю о риске этого, но моя проблема в том, что я немного застрял в том, как перенести код пользовательского интерфейса из button_click в консольное приложение. Спасибо всем - person Benjamin Arancibia; 05.12.2014