2009-03-30 13 views
11

Sto per sviluppare un'applicazione console che sarà necessaria per eseguire ed eseguire continuamente il lavoro in momenti specifici.C# Applicazione console - Continua a funzionare

La mia domanda è quali sono i metodi o le pratiche migliori per mantenere in vita l'applicazione?

I miei pensieri erano: Un ciclo che non finisce mai? Un timer che dorme e poi salta alla routine quando richiesto (dopo il periodo di sospensione impostato)?

Compilerò l'applicazione in un exe e quindi la eseguirò come servizio utilizzando AlwaysUp.

saluti ..

Peter

+0

Il motivo per cui ricevi così tanti diversi tipi di risposte è che non hai fornito molte informazioni su ciò che questa cosa farà. Con più informazioni, sarete in grado di restringere alcune delle opzioni presentate finora. – Cheeso

risposta

8

Perché non costruire la vostra applicazione come un servizio, in primo luogo?

+0

Le finestre dovrebbero utilizzare i servizi in quanto quello è il modello che meglio supporta, non sicuro di chi ha scorticato l'utente su questo. – ojblass

2

Il codice che viene eseguito continuamente si chiama demone e c'è un articolo here che delinea come fare ciò che chiedi. Questo ti indicherà un esempio di come scrivere un semplice servizio here.

+0

Sì, pensavo a un servizio ma non credo che soddisferà le mie esigenze poiché ho bisogno di elaborare i file e leggere le informazioni di configurazione da un file memorizzato in modo da funzionare in orari specifici come specificato nel file di configurazione. –

3

Probabilmente non si vuole semplicemente girare in un ciclo che consuma inutilmente tempo del processore.

Supponendo che tu sia su Windows, dovresti avere un ciclo che non termina mai con una chiamata a WaitForSingleObject() o WaitForMultipleObjects() o MsgWaitForMultipleObjects() a seconda delle tue esigenze. Poi hai un oggetto di sincronizzazione che ti sveglia, come un evento con nome.

Vedere la documentazione di sincronizzazione Win32 here. Se elabori di più su ciò che il tuo programma deve fare, possiamo probabilmente fornire una consulenza più specifica.

+0

Ciao, Grazie per l'aggiornamento, il motivo per cui ho scelto di fare questo come un'applicazione console è che quindi mi dà la possibilità di eseguirlo manualmente in qualsiasi momento. L'applicazione leggerà un file di configurazione ed eseguirà un file di lettura/elaborazione in un dato momento dalle informazioni memorizzate nel file di configurazione. –

+0

Dovrà inoltre inviare un'e-mail di avviso se un file manca in una directory certian. Se il file esiste deve essere aperto e letto in cerca di errori, eventuali errori, quindi è necessario inviare un'e-mail di avviso. –

1

Beh, sono sicuro che a un certo punto dovrebbe fermarsi, no?

Creare un thread che funzioni e avere il blocco thread principale su Console.ReadLine() se si desidera che sia eseguibile anche come app per console.

Se si desidera solo mettere in pausa il thread principale per sempre, basta bloccare su un ManualResetEvent che non si attiva mai.

Tuttavia, è consigliabile utilizzare un servizio se è possibile.

2

Se il programma viene eseguito continuamente, è necessario attendere fino a quando si verifica l'evento desiderato (ad esempio, trascorrono XX secondi). Se fai un giro su un ciclo while {} puoi succhiare i tempi della CPU.

Se il programma sta per essere sempre in esecuzione su una macchina, è consigliabile prendere in considerazione la creazione di un servizio in modo che venga avviato e arrestato automaticamente con la macchina.

13

Una soluzione migliore sarebbe quella di scrivere un'applicazione console che fa il suo lavoro e si chiude. È quindi possibile utilizzare l'Utilità di pianificazione di Windows per eseguirlo periodicamente.

+2

Assolutamente d'accordo! Jon Galloway ha scritto un post sul blog qualche tempo fa che mi ha convinto che stavo sbagliando creando un servizio invece di un'attività: http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

Penso che i servizi offrano maggiore flessibilità in termini di credenziali utente. – ojblass

+0

Almeno per quello che ho visto è possibile impostare le credenziali in cui verrà eseguita l'attività pianificata. Cosa puoi fare con un servizio che non puoi svolgere con un'attività? –

1

Se si crea un'applicazione desktop, è necessario eseguirla nella barra delle applicazioni.Ciò

  1. Tenete gli utenti accidentalmente chiudere l'applicazione
  2. Tenere l'applicazione da affollare lo schermo degli utenti

Se la costruzione di un'applicazione server che si vuole scrivere un servizio di Windows. Ciò

  1. Tenere un amministratore di chiudere accidentalmente la vostra applicazione
  2. Eliminare la necessità per il server di avere qualcuno registrato nella console per la vostra applicazione per essere in esecuzione in

Come qualcuno che è in primo luogo un professionista IT Direi che le applicazioni di terze parti che vengono eseguite come app per console anziché per i servizi di Windows ci impegnano molto a non essere acquistate. Crea molto lavoro per noi e apre importanti problemi di supporto e buchi di sicurezza.

1

Invio di una discussione in stop: System.Threading.Thread.Sleep (10000);

In attesa di un tasto da premere: Console.WriteLine ("Premere un tasto qualsiasi per continuare ..."); Console.Read();

+0

La sospensione del thread rende il software più lento e non deve essere utilizzato. È necessario utilizzare AutoResetSignal per un'app console o creare un servizio se è necessario eseguirlo tutto il tempo. – ppumkin

3

È possibile aggiungere un riferimento a System.Windows.Forms e chiamare System.Windows.Forms.Application.Run() per iniziare un ciclo di messaggi dell'applicazione standard. Ctrl-C terminerà l'applicazione.

Un'altra opzione è utilizzare Console.ReadKey() per mettere in pausa l'app. Come Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

Questo è quello che uso nelle mie applicazioni console quando sono semplicemente seduti lì in attesa per gli eventi che si verifichi. In entrambi i casi, l'app continuerà a funzionare e catturerà gli eventi innescati (come da un timer, WCF, FileWatcher, ecc.).

2

Mentre si dovrebbe davvero utilizzare un servizio per questo, se avete bisogno/vuole fare questo in ogni caso, è possibile utilizzare un ManualResetEvent per fare questo:

private ManualResetEvent Wait = new ManualResetEvent(false); 

Quando hai finito 'a partire' e vuole aspettare solo, si sarebbe poi fare:

Wait.WaitOne(); 

Quando si vuole fermare e lasciare che l'uscita, quindi è possibile fare:

Wait.Set(); 
Problemi correlati