2012-05-28 20 views
7

Attualmente sto utilizzando System.Threading.Timer su un intervallo di 10 secondi. Ho aggiunto una piccola porzione di codice per scrivere su un file ogni volta che scatta il timer, e mentre la maggior parte delle volte si accende in orario, a volte (presumibilmente quando il resto dell'app è acquistato), non riesce a sparare per 30 o 40 secondi e scatta più e più volte in rapida successione.Timer più affidabile di System.Threading.Timer

È possibile utilizzare un timer più affidabile in .NET 3.5?

Il timer è configurato come segue

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); 

... e il callback è:

private static void SomeMethod(object state) 

Tuttavia, è difficile fornire molto più codice di questo, come il Timer di solito spara correttamente . Quando è incorporato in una massiccia applicazione (~ 100.000 linee o giù di lì), con più thread sparati fuori, a sinistra, a destra e al centro, si inizia lentamente a vedere il timer che si attiva ininterrottamente. Ho visto diversi post che suggeriscono che il ThreadPool potrebbe essere esaurito, quindi attualmente sto cercando di capire se questo potrebbe essere ciò che sto vivendo.

+5

È possibile fornire un codice di esempio anziché * assumendo * il timer non è affidabile? Tendo a scoprire che è il mio codice a rappresentare il problema e non i .NET Framework ". –

+0

Il timer è impostato come segue: – JamesPD

+0

Se il tempo di elaborazione del segno di spunta richiede più di 10 secondi, molto probabilmente si verificherà la fame di threadPool. Otterrai lentamente un arretrato di articoli. La tattica standard consiste nel fermare il timer all'ingresso di un evento tick e ricominciare da capo alla fine per non avere "leak timer" a causa dei lunghi tempi di elaborazione. –

risposta

3

Sembra esattamente il digiuno del pool di thread. Cerca lavori a lungo in esecuzione/bloccanti in esecuzione nel pool di thread e riscrivi utilizzando async io, oppure nel caso di lunghi lavori con utilizzo intensivo della CPU, semplicemente non eseguire questi lavori nel pool di thread. Eseguili sul proprio thread o utilizza un worker in background.

+0

Speravo potesse essere solo un problema specifico per System.Threading.Timer, e che passando a un altro Timer, sarei in grado di aggirare il problema. Dopo i tuoi suggerimenti e con un esame più approfondito, sembra davvero un problema di fame ThreadPool. Grazie per tutto l'aiuto, gente. – JamesPD

8

consultare diverse classi di timer in .net

Different Timer class in .net

Ci sono tre classi timer chiamate 'Timer' in .NET. Sembra che tu stia utilizzando Windows Form, ma in realtà potresti trovare più utile la classe System.Threading.Timer, ma fai attenzione perché richiama un thread di pool, quindi non puoi interagire direttamente con il tuo modulo la richiamata.

più accurato Timer - Secondo MSDN

Windows Form componente Timer è thread singolo, ed è limitato ad una precisione di 55 millisecondi. Se si richiede un timer con multithreading con maggiore precisione, utilizzare la classe Timer nello spazio dei nomi System.Timers.

+0

Sembra che lo stia usando, ma in realtà afferma che sta usando 'System.Threading.Timer', che secondo la qualità del metronomo è uno dei due più" affidabili "da scegliere. –

+0

Ciao Romil, grazie per questo, come altri hanno sottolineato, sembra essere un problema di inedia ThreadPool, ma grazie per il tavolo comunque. Sono sicuro che tornerà utile prima o poi. – JamesPD

Problemi correlati