Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 18870|Risposta: 1

[Fonte] Implementazione in C# di tre timer

[Copiato link]
Pubblicato su 12/10/2017 13:12:51 | | |
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ì




Precedente:c# Degruppamento dell'insieme di espressioni Lamda per prendere il valore minimo
Prossimo:Linq: Non usare mai Count() > 0 per determinare che l'insieme non è vuoto
Pubblicato su 08/11/2017 14:02:44 |
È vero. È davvero buono, ma perché non hai risposto al post?
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com