2010-11-25 10 views

Respuesta

0

Como System.Timers.Timer y System.Windows.Forms.Timer ambos usan ThreadPool, no tiene un identificador para el temporizador del sistema operativo, por lo que no hay un recurso de temporizador nativo que se haya eliminado, solo un hilo completo . No estoy seguro de que puedas capturar un hilo reciclado por ThreadPool, pero podría estar equivocado.

Se podría tal vez hágalo usted mismo (no he probado esto, y tomando un ManualResetEvent en Desechar podría ser más útil):

void Run() 
{ 
    ManualResetEvent resetEvent = new ManualResetEvent(false); 

    System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); }); 
    timer.Dispose(resetEvent); 

    MyTimer t = new MyTimer(); 
    t.Interval = 1000; 
    t.Elapsed += delegate { t.Dispose(resetEvent); }; 

    resetEvent.WaitOne(); 
} 


public class MyTimer : System.Timers.Timer 
{ 
    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

    public virtual void Dispose(WaitHandle handle) 
    { 
     handle.SafeWaitHandle.Close(); 
     Dispose(); 
    } 
} 
+0

Creo que el evento System.Timers.Timer Disposed se dispara tan pronto como ha llamado al método System.Threading.Timer Dispose. –

+0

@Ian El evento se llama dentro de 'Component.Dispose (disposing)' para proporcionarle la señal de WaitHandle antes de llamar a base.Dispose(), y usar el Custom Dispose (WaitHandle) que debería activarse después. –

3

establecer un indicador antes de llamar a disponer, y comprobar en esta bandera su manejador transcurrido. Incluso si el temporizador dispara, la bandera evitará que se ejecute cualquier código de controlador asociado. Puede formalizar este patrón escribiendo un contenedor para el temporizador.

Asegúrate de que tu marcador esté marcado como volátil ya que se accederá desde diferentes subprocesos.

+0

Volátil no es lo suficientemente bueno, use un MRE o enclavado. –

+0

@Hans si se establece el indicador volátil antes de llamar a disponer, entonces un hilo del temporizador lo verá si ocurre un evento transcurrido posterior. ¿Cuál es el problema que ves aquí? –

+0

Compruebe los documentos para Thread.MemoryBarrier –

Cuestiones relacionadas