2010-03-22 15 views
6

DOMANDA: Come posso programmare le attività in un'app WinForms? Questo è o (a) qual è l'approccio migliore/classi/metodi .NET da usare di (b) se c'è un componente open source che fa questo bene quale sarebbe raccomandato.Come posso programmare le attività in un'app WinForms?

BACKGROUND:

  • WinForms app (NET v3.5, C#, VS2008)
  • sto assumendo correrò l'applicazione WinForms sempre, e solo ridurre al minimo il vassoio di sistema quando non è in usa
  • Vuoi un approccio semplice (non vuoi entrare in un servizio separato che esegue l'interfaccia utente winforms parla con ecc.)
  • Vuoi essere in grado di consentire all'utente di selezionare la frequenza con cui pianificare la sincronizzazione (ad esempio ogni ora, ogni giorno - orario di ritiro, ecc.)
  • Possibilità di nei momenti in cui i fuochi scheduler per eseguire un pezzo di codice (assumere potrebbe essere avvolto come un compito BackgroundWorker per esempio)
  • L'applicazione è sempre in esecuzione & appare nella barra di sistema

risposta

2

Se non si desidera un servizio di Windows, avviare l'applicazione con Windows è un'opzione. puoi usare il seguente codice per farlo.

Dim regKey As RegistryKey 
regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) 
regKey.SetValue(Application.ProductName, Application.ExecutablePath) 
regKey.Close() 

Cosa intendevi per pianificare la sincronizzazione? è un servizio diff? Quindi è possibile utilizzare il timer e quindi memorizzare le impostazioni utente in un file xml o un DB. Se si desidera una memorizzazione semplice, è possibile utilizzare My.Settings.

Modifica: Penso che il solo modo sia controllare la data in cui l'app si avvia e controllare periodicamente la data. Un'altra opzione è usare programmaticamente l'utilità di pianificazione. Task Scheduler Managed Wrapper è un wrapper open source che puoi provare.

+0

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

+0

Ho modificato la mia domanda. si prega di controllare. – Shoban

+0

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

1

Così vuoi eseguire attività che sono codice predefinito nella tua app e non exe esterni?

  • Creare un'app winforms con un'icona nell'area di notifica. Se si esegue la distribuzione utilizzando clic una volta, rendere il nome del server di pubblicazione "Esecuzione automatica" in modo da installare un collegamento nella directory di avvio.

  • Utilizzare un timer per verificare la pianificazione e avviare i thread, se necessario. Memorizza la pianificazione locale in un file XML in modo che possa essere facilmente interrogata con LINQ.

  • Si sta eseguendo le attività con Background worker in modo che il threading sia già in uso.

Se si desidera utilizzare l'Utilità di pianificazione di Windows, tuttavia, esiste un'API per questo. Non è un modulo aggraziato ma funziona abbastanza bene.

+0

ok - così qualcosa come ottenere il timer da impostare per 5 minuti, quindi ogni 5 minuti fai un controllo (all'interno del tuo codice applicazione) per vedere se hai attraversato il prossimo punto programmato? (ad esempio, quindi non è possibile avvisare direttamente il mio codice ogni giorno alle 23.00, ad esempio?) – Greg

+1

L'utilizzo di un timer non è accurato, poiché si verificano intervalli predefiniti. Se si desidera essere precisi, utilizzare l'Utilità di pianificazione di Windows: c'è un API _wrapper_ piuttosto grazioso per questo. –

+0

grazie Maxim - nota la mia domanda nell'altra risposta che inizia con "Oh ... se corro con ..." - qualsiasi feedback su questo benvenuto – Greg

10

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

+0

thansk Maxim - qualche idea su come questo si paragona all'uso del wrapper gestito dell'Utilità di pianificazione che Shoban ha suggerito? http://taskscheduler.codeplex.com/ – Greg

+0

Appena verificato che uno, sembra essere più recente. Inoltre, non so se quello che ho suggerito funziona con Task Scheduler 2.0 (Vista e Win7), ma ci proverò. –

Problemi correlati