visual timers threading studio net ejemplo c# .net multithreading timer

c# - threading - timers timer vb net



¿Timer.Change() alguna vez devuelve falso? (3)

Al verificar la fuente gestionada, el único caso en el que devuelve falso es si el temporizador AppDomain (si no existe, se crea) representado por una clase privada AppDomainTimerSafeHandle - tiene SafeHandle.IsInvalid establecido en verdadero.

Dado que AppDomainTimerSafeHandle hereda de SafeHandleZeroOrMinusOneIsInvalid , IsInvalid lo implementa, cuando la infraestructura no administrada intenta crear un temporizador y termina con un Safe-Handle que lee de la definición Zero-Or-Minus-One-Is-Inválido.

Todos los casos apuntan a que esto es extremadamente improbable.

La clase .NET System.Threading Timer tiene varios métodos Change () sobrecargados que devuelven "verdadero si el temporizador se actualizó correctamente; de ​​lo contrario, es falso".

Ref: http://msdn.microsoft.com/en-us/library/yz1c7148.aspx

¿Este método alguna vez realmente devuelve falso? ¿Qué haría que esto sea falso?


De hecho, esto puede devolver falso si el extern ChangeTimerNative externo no administrado devuelve falso. Sin embargo, esto es muy poco probable.

Toma nota del código de Microsoft:

bool status = false; bool bLockTaken = false; // prepare here to prevent threadabort from occuring which could // destroy m_lock state. lock(this) can''t be used due to critical // finalizer and thinlock/syncblock escalation. RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { do { if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) { bLockTaken = true; try { if (timerDeleted != 0) throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic")); status = ChangeTimerNative(dueTime,period); } finally { m_lock = 0; } } Thread.SpinWait(1); // yield to processor } while (!bLockTaken); } return status;

TENGA EN CUENTA que ChangeTimerNative llama a la función API de Windows ChangeTimerQueueTimer para que pueda leer esa documentación y tener una idea de cómo podría fallar.


Joe Duffy (el líder de desarrollo, arquitecto y fundador de las extensiones paralelas del equipo .NET Framework en Microsoft) detallado en Programación concurrente en Windows p 373

Tenga en cuenta que aunque Change se escribe como devolver un bool , en realidad nunca devolverá nada que no sea verdadero. Si hay un problema al cambiar el temporizador, como el objeto de destino que ya se ha eliminado, se lanzará una excepción.