2012-06-25 29 views
8

Il thread principale dell'applicazione sta facendo un po 'di lavoro.Metodo di chiamata asincrona C# periodicamente

Esiste anche un timer, che ogni 10 minuti chiama un metodo che dovrebbe funzionare in modo asincrono.

Potrebbe per favore darmi un buon esempio su come organizzarlo?

+2

È questo ASP.NET, moduli, altro? –

+1

Si tratta di un'app GUI? – Tudor

+0

È un servizio Windows che è in realtà un server e che ascolta sempre nuove connessioni. Quindi non c'è GUI, ma il lavoro del server non dovrebbe essere interrotto – Ksice

risposta

12

Non suggerirei di utilizzare un thread esplicito con un ciclo e dormire. È cattiva pratica e brutta. Esistono classi di timer per questo scopo:

Se questa non è un'app GUI, è possibile utilizzare System.Threading.Timer per eseguire periodicamente il codice su un thread diverso.

Se questa è un'app WinForms/WPF, dare un'occhiata a System.Windows.Forms.Timer e System.Windows.Threading.DispatcherTimer rispettivamente. Questi sono utili perché eseguono il loro codice sul thread della GUI, quindi non necessitano di chiamate esplicite Invoke.

I collegamenti contengono anche esempi per ognuno.

+0

Solo una curiosità, se questi timer vengono eseguiti sul thread della GUI, bloccherà l'applicazione principale, sicuramente un thread separato è migliore per il requisito asincrono? Sono d'accordo però che mantenere un thread intero vivo per un'esecuzione ogni 10 minuti non è però l'ideale. – Vok

+0

@ Vok: dipende da cosa devi fare. Questi timer sono utili per un rapido aggiornamento periodico della GUI. Se il codice è più longevo, dovresti usare 'System.Threading.Timer' con un esplicito' Invoke' solo per la parte di aggiornamento. Ad ogni modo, è bello conoscere gli strumenti disponibili per diverse situazioni. – Tudor

1

Il modo più semplice è chiamare una funzione grande che dorme per 10 minuti tra le azioni. Questo non blocca nulla perché è in un'altra discussione.

In .NET 4, si dovrebbe farlo con la classe Task:

Task t = Task.Factory.StartNew(() => { /* your code here */ }); 
// or 
Task t = Task.Factory.StartNew(YourFunctionHere); 

void YourFunction() { 
    while (someCondition) { 
     // do something 
     Thread.Sleep(TimeSpan.FromMinutes(10)); 
    } 
} 

(questo codice non è stato testato)

0

Utilizzare un filo BackgroundWorker.

void FireTask() 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //Your job 
} 
-2

avviare un altro thread che esegue un ciclo

All'interno del ciclo; dormire per 10 minuti quindi chiamare il metodo, ripetere

Problemi correlati