2012-05-28 22 views
7

Actualmente estoy usando System.Threading.Timer en un intervalo de 10 segundos. He agregado un pequeño fragmento de código para escribir en un archivo cada vez que se dispara el temporizador, y aunque la mayoría de las veces se dispara a tiempo, a veces (presumiblemente cuando se compra el resto de la aplicación), no se dispara durante 30 o 40 segundos, y dispara una y otra vez en rápida sucesión.Temporizador más confiable que System.Threading.Timer

¿Existe un temporizador más confiable que pueda usar en .NET 3.5?

El temporizador se configura como sigue

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

... y la devolución de llamada es:

private static void SomeMethod(object state) 

Sin embargo, es difícil proporcionar mucho más código que esto, como el temporizador general los incendios correctamente . Cuando está incrustado en una aplicación masiva (~ 100,000 líneas más o menos), con múltiples hilos que se disparan, izquierda, derecha y centro, lentamente comienzas a ver el temporizador disparándose intermitentemente. He visto varias publicaciones que sugieren que el ThreadPool puede estar agotado, por lo que estoy buscando para ver si esto podría ser lo que estoy experimentando.

+5

¿Puede proporcionar algún código de muestra en lugar de * suponiendo * que el temporizador no es confiable? Tiendo a encontrar que es mi propio código el problema y no el .NET Frameworks. –

+0

El temporizador se configura de la siguiente manera: – JamesPD

+0

Es muy probable que el consumo de ThreadPool sea el caso si el procesamiento de la marca tarda más de 10 segundos. Obtendrá lentamente una acumulación de elementos. La táctica estándar es detener el temporizador de entrada a un evento de marcación y volver a iniciarlo al final para no tener "pérdida de temporizador" debido a los largos tiempos de procesamiento. –

Respuesta

3

Esto suena exactamente como inanición de grupo de subprocesos. Preste atención a los trabajos de larga ejecución/bloqueo que se ejecutan en el grupo de subprocesos y reescriba con async io, o en el caso de trabajos intensivos de CPU de larga ejecución, simplemente no ejecute estos trabajos en el grupo de subprocesos. Ejecútelos en su propio hilo o use un trabajador de fondo.

+0

Tenía la esperanza de que podría haber sido un problema específico de System.Threading.Timer, y que al cambiar a otro Timer, sería capaz de solucionar el problema. Después de tus sugerencias y con una inspección más cercana, parece un problema de inanición en ThreadPool. Gracias por toda la ayuda gente. – JamesPD

8

Consulte las diferentes clases de temporizador en .net

Different Timer class in .net

Hay tres clases de temporizador denominado temporizador 'en .NET. Parece que está utilizando el formulario de Windows Forms, pero en realidad puede encontrar que la clase System.Threading.Timer es más útil, pero tenga cuidado porque devuelve la llamada a un hilo del grupo, por lo que no puede interactuar directamente con su formulario desde la devolución de llamada.

más precisa Timer - Según MSDN

El Windows Forms componente Timer es de un solo subproceso, y se limita a una precisión de 55 milisegundos. Si necesita un temporizador multiproceso con mayor precisión, use la clase Timer en el espacio de nombres System.Timers.

+0

Parece que lo está usando, pero en realidad dice que está usando 'System.Threading.Timer', que de acuerdo con la calidad del metrónomo es uno de los dos más" confiables "para elegir. –

+0

Hola Romil, gracias por eso, como han señalado otros, parece ser un problema de inanición en ThreadPool, pero gracias por la mesa, no obstante. Estoy seguro de que será útil tarde o temprano. – JamesPD

Cuestiones relacionadas