System.Timers.Timer vs System.Threading.Timer

Ultimamente ho controllato alcuni dei possibili timer e Threading.Timer e Timers.Timer sono quelli che mi sembrano necessari (poiché supportano il pooling dei thread).

Sto facendo un gioco e ho intenzione di utilizzare tutti i tipi di eventi, con intervalli diversi, ecc.

Quale sarebbe il migliore?

Questo articolo offre una spiegazione abbastanza esauriente:

” Confronto tra le classi di timer nella libreria di classi .NET Framework ” – disponibile anche come file .chm

La differenza specifica sembra essere che System.Timers.Timer è orientato verso applicazioni multithreaded ed è quindi thread-safe tramite la sua proprietà SynchronizationObject , mentre System.Threading.Timer è ironicamente non thread-safe out-of-the-box.

Non credo che ci sia una differenza tra i due in quanto riguarda quanto piccoli possono essere i tuoi intervalli.

System.Threading.Timer è un semplice timer. Ti richiama su un thread pool di thread (dal pool di worker).

System.Timers.Timer è un System.ComponentModel.Component che include un System.Threading.Timer e fornisce alcune funzionalità aggiuntive utilizzate per l’invio su un determinato thread.

System.Windows.Forms.Timer invece System.Windows.Forms.Timer wrapping di un HWND nativo solo per messaggi e utilizza i timer di Windows per generare eventi nel ciclo di messaggi di HWND.

Se la tua app non ha un’interfaccia utente e desideri il timer .Net più leggero e generico ansible, (perché sei felice di capire il tuo threading / dispacciamento), System.Threading.Timer è buono come entra il quadro.

Non sono completamente chiaro quali sono i problemi di “non thread safe” con System.Threading.Timer . Forse è proprio come è stato chiesto in questa domanda: thread-safety di System.Timers.Timer vs System.Threading.Timer , o forse tutti semplicemente significa che:

  1. è facile scrivere le condizioni di gara quando si utilizzano i timer. Ad esempio, vedi questa domanda: sicurezza del thread Timer (System.Threading)

  2. re-entrancy delle notifiche del timer, in cui l’evento del timer può triggersrsi e richiamarti una seconda volta prima di completare l’elaborazione del primo evento. Ad esempio, vedi questa domanda: Esecuzione thread-safe usando System.Threading.Timer e Monitor

Nel suo libro ” CLR Via C # “, Jeff Ritcher scoraggia l’utilizzo di System.Timers.Timer , questo timer è derivato da System.ComponentModel.Component , consentendo di utilizzarlo nella superficie di progettazione di Visual Studio. In modo che sarebbe utile solo se si desidera un timer su una superficie di progettazione.

Preferisce utilizzare System.Threading.Timer per attività in background su un thread del thread.

System.Timers.Timer sembra essere deprecato con .NET Core e ASP.NET Core. Quindi prova a utilizzare System.Threading.Timer nelle app future.


EDIT: OK, fammi essere più preciso:

Con il nuovo .NET Core Framework, Microsoft ha interrotto alcune tecnologie di .NET Framework. Per capirlo: .NET Core è un framework totalmente nuovo – riscritto, multipiattaforma, ecc. Non voglio approfondire qui in dettaglio – per favore leggi il blog di .NET .

Sul blog c’è un buon articolo sul porting su .NET Core che spiega anche le difficoltà che si possono riscontrare. Una parte di questo è utilizzare il componente aggiuntivo di Visual Studio .NET Analyzer Portabilità e correggere gli errori che si ottengono.

Per la class System.Timers.Timer , è stato detto che .NET Framework, Versione = v4.6.2 è supportato, ma .NET Core, Versione = v5.0 e .NETPlatform, Versione = v5.0 no. Modifiche consigliate: Use System.Threading.Timer .

Quindi, mi sembra che System.Timers.Timer sia andato per .NET Core.

PS: Ma potrebbe tornare – Microsoft ha annunciato che vogliono apportare alcune modifiche a CoreCLR (il nome del framework che si utilizza per .NET Core) per semplificare lo sforzo di porting.

Ho trovato un breve confronto da MSDN

La libreria di classi .NET Framework include quattro classi denominate Timer, ognuna delle quali offre funzionalità diverse:

System.Timers.Timer , che triggers un evento ed esegue il codice in uno o più event sink a intervalli regolari. La class è concepita per l’utilizzo come componente basato su server o servizio in un ambiente con multithreading; non ha interfaccia utente e non è visibile in fase di runtime.

System.Threading.Timer , che esegue un singolo metodo di callback su un thread pool di thread a intervalli regolari. Il metodo di callback è definito quando il timer è istanziato e non può essere modificato. Come la class System.Timers.Timer, questa class è concepita per essere utilizzata come componente server o di servizio in un ambiente con multithreading; non ha interfaccia utente e non è visibile in fase di runtime.

System.Windows.Forms.Timer , un componente Windows Form che genera un evento ed esegue il codice in uno o più event sink a intervalli regolari. Il componente non ha un’interfaccia utente ed è progettato per l’uso in un ambiente a thread singolo.

System.Web.UI.Timer , un componente ASP.NET che esegue postback di pagine Web asincrone o sincrone a intervalli regolari.

Un’importante differenza non menzionata sopra che potrebbe sorprenderti è che System.Timers.Timer silenziosamente le eccezioni, mentre System.Threading.Timer no.

Per esempio:

 var timer = new System.Timers.Timer { AutoReset = false }; timer.Elapsed += (sender, args) => { var z = 0; var i = 1 / z; }; timer.Start(); 

vs

 var timer = new System.Threading.Timer(x => { var z = 0; var i = 1 / z; }, null, 0, Timeout.Infinite); 

Le due classi sono funzionalmente equivalenti, tranne che System.Timers.Timer ha un’opzione per richiamare tutte le sue richiamate di scadenza del timer tramite ISynchronizeInvoke impostando SynchronizingObject . In caso contrario, entrambi i timer richiamano i callback di scadenza sui thread del pool di thread.

Quando si trascina un System.Timers.Timer su una superficie di progettazione di Windows Form, Visual Studio imposta SynchronizingObject sull’object form, che provoca la chiamata di tutti i callback di scadenza sul thread dell’interfaccia utente.

Da MSDN: System.Threading.Timer è un timer semplice e leggero che utilizza i metodi di callback ed è servito dai thread del pool di thread. Non è consigliato per l’uso con Windows Form, perché i suoi callback non si verificano sul thread dell’interfaccia utente. System.Windows.Forms.Timer è una scelta migliore per l’utilizzo con Windows Form. Per la funzionalità del timer basata su server, potresti prendere in considerazione l’utilizzo di System.Timers.Timer , che genera eventi e ha funzionalità aggiuntive.

fonte