Riguardo alla classe timer in C# Ci sono tre classi timer in C#
1. Definire in System.Windows.Forms
2. Definita nella classe System.Threading.Timer
3. Definita nella classe System.Timers.Timer
System.Windows.Forms.Timer viene applicato a WinForm, implementato tramite il meccanismo di messaggi di Windows, simile al controllo Timer in VB o Delphi, ed è implementato internamente tramite l'API SetTimer. Il suo principale svantaggio è che la tempistica non è precisa e deve esserci un loop di messaggi, che non è disponibile per l'applicazione Console.
System.Timers.Timer è molto simile a System.Threading.Timer, sono implementati tramite .NET Thread Pool, con tempismo leggero e accurato, e senza requisiti particolari per applicazioni e messaggi. System.Timers.Timer può essere applicato anche a WinForm, sostituendo completamente il controllo Timer sopra. Il loro svantaggio è che non supportano il drag-and-drop diretto e richiedono la codifica manuale.
Esempio:
Usa la classe System.Timers.Timer
Timers.System.Timer t = nuovo Timer.System.Timer(10000); Istituisce la classe Timer e imposta l'intervallo a 10.000 millisecondi.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Eseguire gli eventi quando il momento è arrivato;
t.AutoReset = vero; Imposta se eseguire una volta (falso) o sempre (vero);
t.Enabled = vero; se eseguire l'evento System.Timers.Timer.Elapsed;
public void theout (sorgente oggetto, System.Timers.ElapsedEventArgs e)
{
MessaggioBox.Mostra("OK!");
}
Analisi sperimentale delle somiglianze e differenze tra l'uso di tre timer in C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Ci sono tre tipi di timer disponibili in C#:
1. Timer standard basato su Windows (System.Windows.Forms.Timer)
2. Timer basato su server (System.Timers.Timer)
3. Timer di threading (System.Threading.Timer)
Facciamo alcuni piccoli esperimenti per analizzare le somiglianze e le differenze tra i tre timer, specialmente la parte relativa ai thread.
Screenshot di un esempio sperimentale:
1. Timer standard basato su Windows (System.Windows.Forms.Timer)
La prima cosa da notare è che Windows Timer è progettato per ambienti single-threaded
Questo timer è presente nel prodotto dalla versione 1.0 di Visual Basic ed è rimasto in gran parte invariato
Questo timer è il più semplice da usare, basta trascinare il controllo Timer dalla cassetta degli attrezzi al modulo e impostare le proprietà come eventi e intervalli
I risultati sperimentali sono inoltre pienamente coerenti con le caratteristiche del singolo threading:
1. Quando questo timer viene avviato, l'ID thread figlio verrà visualizzato nella lista ID thread figlio qui sotto, ed è lo stesso dell'ID thread principale
vuoto privato formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "Esecuzione sottothread, ID thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Quando il thread principale è in pausa per 5 secondi, il thread figlio metterà in pausa l'esecuzione, e se il thread figlio precedentemente sospeso non verrà eseguito dopo 5 secondi, il thread figlio successivo verrà eseguito direttamente (cioè, emerserà alcune righe di valori).
System.Threading.Thread.Sleep(5000);
3. Mettere in pausa gli eventi di un processo figlio per 5 secondi farà sì che la finestra principale non risponda per 5 secondi
4. Definire una variabile statica del thread:
[Statico del filo]
statico privato int i = 0;
Aggiungine uno a ogni evento sottothread, poi clicca sul valore della variabile statica del thread per ottenere il valore i aumentato
2. Timer basato su server (System.Timers.Timer)
System.Timers.Timer non dipende dai moduli, risveglia i thread dal pool di thread ed è una versione aggiornata del timer tradizionale ottimizzata per funzionare su un ambiente server
Non ci sono controlli pronti all'uso nel toolbox VS2005 e devono essere codificati manualmente per utilizzare questo timer
Ci sono due modi per usarla,
1. Collegare al modulo tramite la proprietà SynchronizzingObject
Timer.Sistema.Timers. Timer Timer = nuovo Timer.Timer();
timersTimer.Enabled = falso;
timersTimer.Intervallo = 100;
timersTimer.Elapsed += nuovo System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = questo;
In questo modo, l'esperimento funziona quasi come un timer standard basato su Windows, tranne che nel secondo esperimento sopra, anche se l'esecuzione del sottothread sarà pausata, dopo 5 secondi tutte le attività precedentemente in coda verranno eseguite (cioè non mancheranno poche righe di valore).
2. Non utilizzare la proprietà SynchronizzingObject
Questo metodo è multithread, cioè il thread figlio iniziale e la forma principale non sono sullo stesso thread. Tuttavia, c'è anche un problema: poiché il sottothread è un thread separato, i controlli nel modulo non possono essere accessibili, ma possono essere accessibili solo tramite un proxy:
delegare void SetTextCallback(string text);
Fonte: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Confronto di tre oggetti timer nel blog C#_dash_Sina
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "esecuzione thread figlio, ID thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nuovo SetTextCallback(SetText);
Questo. Invoca(d, nuovo oggetto[] { testo });
i++;
}
privato void SetText (testo stringa)
{
lblSubThread.Text += testo;
}
In questo modo, otterremo nuovamente i seguenti risultati dall'esperimento:
1. Quando questo timer viene avviato, l'ID thread figlio verrà visualizzato nella lista ID thread figlio qui sotto, ed è diverso dall'ID thread principale
2. Quando clicchi sul thread principale per fermarti per 5 secondi, il sottothread continuerà a essere eseguito (potrebbe non essere visibile sull'interfaccia, ma può essere facilmente visto inviando il file nel sottothread)
3. Mettere in pausa gli eventi di un processo figlio per 5 secondi non farà smettere di rispondere la finestra principale
4. Aggiunge uno alla variabile statica del thread ogni volta nell'evento del sottothread, e poi clicca se la variabile statica del thread vale 0 o 0 (non cambierà la variabile statica del thread nella finestra principale).
3. Timer di threading (System.Threading.Timer)
I thread timer non si basano nemmeno sui moduli, sono semplici e leggeri timer che usano metodi di callback invece di eventi, e sono alimentati da thread pool thread.
I timer dei thread sono utili in situazioni in cui i messaggi non vengono inviati sui thread.
Ecco come usarlo:
System.Threading.Timer threadTimer;
Public void ThreadMethod (Stato oggetto)
{
//使用代理
string text = "esecuzione thread figlio, ID thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nuovo SetTextCallback(SetText);
Questo. Invoca(d, nuovo oggetto[] { testo });
i++;
}
vuoto privato Form1_Load(oggetto mittente, EventArgs e)
{
threadTimer = nuovo System.Threading.Timer(nuovo System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Codice di pausa:
threadTimer.Change(-1, -1);
L'effetto dell'esperimento è lo stesso del secondo metodo del timer basato su server (System.Timers.Timer),
Naturalmente, i metodi e i principi d'uso specifici sono diversi, la cosa più importante è che questo metodo utilizza il metodo agente invece che quello degli eventi, e può essere eseguito separatamente senza dipendere da moduli e componenti
Di seguito è riportata una tabella riassunta dagli stranieri (la differenza tra i tre metodi):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Supporto per aggiungere e rimuovere ascoltatori dopo che il timer è stato istianziato. Sì No Sì
Supporta i richiami nel thread dell'interfaccia utente Sì No Sì
Chiamate da thread ottenute dal pool di thread Sì Sì No
Supporta il drag-and-drop nel Windows Forms Designer Sì No Sì
Adatto per l'esecuzione in un ambiente server multithread Sì Sì No
Include il supporto per il passaggio di uno stato arbitrario dall'inizializzazione del timer al callback. No Sì No No
Implementa IDisposable Sì Sì Sì
Supporta callback occasionali così come callback periodici ripetuti Sì Sì Sì Sì
Accessibili oltre i confini del dominio applicativo Sì Sì Sì Sì
Supporta IComponent – ospitabile in un IContainer Sì No Sì |