2014-12-05 2 views
0

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

Большое спасибо.

+4

Создать консольное приложение, которое срабатывает по расписанию окна, или создать службу Windows который использует Quartz для выполнения задания. –

ответ

-2

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

+1

Это * чрезвычайно * хрупкий, и это не очень хороший способ автоматизировать что-то вроде этого для чего-то работающего в течение такого длительного периода времени. Это означает, что код должен работать 24 часа в сутки, а не только тогда, когда ему приходится работать (что означает потребление системных ресурсов за все это время), перезапуск компьютера будет бесполезным с ним, пользователь может довольно легко случайно закрыть его и т. Д. . И это не говоря уже обо всех проблемах с дат-временем. Что происходит, когда кто-то меняет системные часы, например. – Servy

+0

Как правило, это не так. –

-1

Что вам нужно сделать, это централизовать код обработчика событий в нечто вроде библиотеки классов. Тогда ваш обработчик событий может просто вызвать этот централизованный метод. Как только вы это сделаете, вы можете создать консольное приложение или службу 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 
     } 
} 
+0

Привет, Спасибо за ваш ответ, это означает, что это невозможно сделать с помощью оконной формы? он будет работать только с консольным приложением? проблема в том, что мое приложение является клиентом веб-службы, и я потребляю веб-службу. Спасибо –

+0

Это не единственный способ, которым вы можете это сделать, но я бы настоятельно рекомендовал его по любому виду kludge, который включал бы нажатие кнопки на форме, основанной на каком-то таймере. Ничто не мешает вам использовать веб-службу из библиотеки классов. И если вы централизуете код в библиотеке классов, вы можете повторно использовать его в консольном приложении или winform. – YtramX

+0

@BenjaminArancibia Почему факт, что это клиент веб-сервиса, означает, что вам нужно использовать приложение winform, а не консольное приложение или приложение-приложение для Windows? – Servy

-2

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

В своем 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(); 
} 
+1

Это * чрезвычайно * хрупкий, и это не очень хороший способ автоматизировать что-то подобное для чего-то работающего в течение такого длительного периода времени. Это означает, что код должен работать 24 часа в сутки, а не только тогда, когда ему приходится работать (что означает потребление системных ресурсов за все это время), перезапуск компьютера будет бесполезным с ним, пользователь может довольно легко случайно закрыть его и т. Д. . И это не говоря уже обо всех проблемах с дат-временем. Что происходит, когда кто-то меняет системные часы, например. – Servy

+0

@Servy полностью не согласен с вами, вы использовали функцию таймера? Эта строка: таймер.Interval = Convert.ToInt32 (dailyServiceInterval) * 60 * 1000; Приведёт к тому, что ваш код будет запущен только тогда, когда он будет запущен, он не будет работать 24/7. . У этого элемента управления .Net есть этот элемент управления. Но другой способ сделать это - создать программу консоли управления и поместить код в основной метод. А затем добавьте программу в Планировщик задач Windows. – picossi

+0

Процесс будет активным 24/7. Он не будет активно потреблять процессор постоянно, но его объем памяти будет активным во все времена, что делает возможным утечку памяти очень реальным, и это приводит к другим проблемам, которые я расширил; что пользователь может легко закрыть его случайно, перезапуск будет бесполезен с ним и т. д. Это все прямые эффекты того факта, что фактически процесс работает 24 часа в сутки, 7, вместо того, чтобы планировать ОС через что-то вроде планировщика задач или как оказание услуг. «Таймер» предназначен в первую очередь для более коротких интервалов. – Servy

Смежные вопросы