Con riferimento a questo preventivo da MSDN sul System.Timers.Timer:Sincronizzazione di un metodo trascorso Timers.Timer quando si arresta
L'evento Timer.Elapsed è sollevata su un filo ThreadPool, quindi l'evento il metodo di gestione può essere eseguito su un thread contemporaneamente a una chiamata a mentre il metodo Timer.Stop viene eseguito su un altro thread . Ciò potrebbe causare l'evento Elapsed che viene generato dopo che è stato chiamato il metodo Stop . Questa condizione di competizione non può essere prevenuta semplicemente confrontando la proprietà SignalTime con il momento in cui il metodo Stop è chiamato, perché il metodo di gestione degli eventi potrebbe essere già in esecuzione quando il metodo fermata si chiama, o potrebbe iniziare l'esecuzione tra il momento quando viene chiamato il metodo Stop e il momento quando viene salvato il tempo di arresto. Se è fondamentale per evitare che il filo che chiama il metodo Stop da procedimento mentre il metodo di gestione degli eventi è ancora in esecuzione, utilizzare un più robusto meccanismo di sincronizzazione come come la classe Monitor o il metodo CompareExchange. Il codice che utilizza il metodo CompareExchange può essere trovato nell'esempio per il metodo Timer.Stop .
chiunque può dare un esempio di un "meccanismo di sincronizzazione robusta come la classe Monitor" per spiegare cosa significa esattamente?
Sto pensando che significa usare un blocco in qualche modo, ma non sono sicuro di come lo implementeresti.
Wow, i timer sono davvero bestie insidiose. : o – Andy
Sì, questo cade quando sei sull'aereo che vola a casa. Huff e puff, stress testate l'inferno prima di salire a bordo. –
Avendo riflettuto un po ', sembra che crei un Threading.Timer dietro le quinte, e il callback in effetti annulla le eccezioni. L'implementazione del threading di base.Timer da solo sembra essere molto più pulito, quindi avrò una lettura su questo. – Andy