In realtà c'è qualcosa direttamente incorporato in Windows che farà proprio questo. Si chiama Task Scheduler di Windows! Piuttosto che avere un'applicazione Windows che si siede e aspetta il momento giusto per eseguire una parte di codice, starai meglio usando solo un'utilità di sistema sottostante e memorizzando la parte di codice da eseguire in un eseguibile separato: è più semplice e più efficiente.
Ho usato l'Utilità di pianificazione prima di configurare le mie applicazioni per iniziare con una pianificazione piuttosto specifica. Il modo migliore per farlo da un'applicazione .NET è utilizzare this handy little library.
Fondamentalmente, per ottenere ciò che hai dichiarato nella domanda, è necessario creare un'applicazione Windows che fornisca una GUI. Questa GUI dovrebbe avere opzioni che regolano la creazione e l'alterazione di un compito. L'attività dovrebbe avviare il codice che devi eseguire (dovresti archiviarlo in un file eseguibile separato, probabilmente come un'app di WinForms che è trasparente e, quindi, nascosto.)
Ecco alcuni codice from the CodeProject article of the library itself che illustra come creare un'attività:
//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();
NOTA: l'opzione priority
mai lavorato per me, crash sempre l'applicazione. Ti raccomando di lasciarlo fuori; di solito, non fa una grande differenza.
Non ci sono altri esempi di codice on the article page, alcuni dei quali mostrano come modificare le impostazioni di un task, elencare tutte le attività pianificate, ecc
fonte
2010-03-22 05:23:30
Spiacente, il mio uso di "sincronizzazione" complica le cose. È solo un'applicazione Windows che l'utente può pianificare periodicamente un "task" da eseguire. Ho un database in modo da poter memorizzare i dati lì. Quindi l'uso della classe Timer sembra essere la strada da percorrere, ma devi fare il giorno/l'ora per verificare te stesso nel tuo codice allora? (poiché il timer non ha in realtà alcuna configurazione di calendario basata su di esso sembra) – Greg
Ho modificato la mia domanda. si prega di controllare. – Shoban
sono sì ... questo (cioè Task Scheduler Managed Wrapper) era il genere di cosa che stavo pescando ... pensi che questo sia un approccio robusto? In altre parole sarebbe più robusto/sicuro usare semplicemente il Timer e scrivere il codice di controllo data/ora nell'applicazione? Da robusto credo che intendo posso presumere che funzionerebbe su qualsiasi PC senza gottchas (alberit XP, o vista o Windows 7, ecc.) – Greg