2010-08-06 13 views
6

A veces, cuando se invoca BeginInvoke, se tarda más de un segundo en ejecutar el método de delegado.Delegate.BeginInvoke Delay

¿Cuáles podrían ser las razones del retraso? Recibo este problema 1 o 2 veces al día en una aplicación que se ejecuta continuamente.

Por favor, ayúdame.

Gracias!

+2

¿Esto es 'Control.BeginInvoke' o' Delegate.BeginInvoke'? –

+2

Está haciendo un nuevo hilo, pero no sé cuánto tiempo debería durar. Probablemente muy rápido. –

+0

Crear un nuevo hilo es relativamente caro. –

Respuesta

7

El administrador de grupo de subprocesos se asegura de que solo se permite la ejecución de tantos subprocesos, ya que tiene núcleos de CPU. Tan pronto como se completa, se permite ejecutar otra que está esperando en la cola.

Dos veces por segundo, reevalúa lo que está sucediendo con los hilos en ejecución. Si no completan, se supone que están bloqueados y permite que se ejecute otro hilo en espera. En la típica CPU de dos núcleos, obtendrá dos subprocesos ejecutándose de inmediato, el tercer subproceso comenzará después de un segundo, el cuarto subproceso después de 1.5 segundos, etcétera.

Bueno, ahí está tu segundo. La corrección Q & D es usar ThreadPool.SetMinThreads(), pero esa es la solución mazo. El problema real es que su programa utiliza subprocesos de grupo de subprocesos para tareas de larga ejecución. Ya sea porque ejecutan una gran cantidad de código o porque bloquean algún tipo de solicitud de E/S. Este último es el caso más común.

La manera de resolverlo es no utilice un hilo de grupo de subprocesos para tal subproceso de bloqueo, pero utilice la clase Thread en su lugar. No haga esto si los hilos realmente están quemando ciclos de CPU, reducirá la velocidad de todo. Fácil de decir, verás 100% de carga de CPU en Taskmgr.exe

+0

Hola Hans, Gracias por la respuesta. ¿Hay alguna manera fácil de entender qué subproceso de agrupación de subprocesos está bloqueando en IO o tomando más ciclos de CPU. Gracias! – Maanu

+0

Si no sabe, usa demasiados. Puede averiguar iniciando sesión start + end. –

2

¿Puede establecer la prioridad de BeginInvoke?

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx

¿Tiene otra BeginInvoke llamadas en espera?

"Si se realizan varias llamadas a BeginInvoke en el mismo DispatcherPriority, se ejecutarán en el orden en que se hicieron las llamadas."

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

+0

Es Delegate.BeginInvoke. Mido la diferencia registrando. Hay una entrada de registro antes de llamar a BeginInvoke. También hay una entrada de registro en el método de delegado. – Maanu

4

Dado que está utilizando Delegate.BeginInvoke entonces estás, de forma indirecta, mediante el ThreadPool. El ThreadPool recicla hilos terminados y les permite ser reutilizados sin pasar por el gasto de construir nuevos hilos y desgarrar los hilos completos.

Entonces ... cuando usa Delegate.BeginInvoke está agregando el método a invocar a una cola, tan pronto como el ThreadPool cree que tiene un hilo disponible para su tarea, se ejecutará. Sin embargo, si el ThreadPool está sin hilos disponibles, entonces lo dejarán esperando.

System.Threading.ThreadPool tiene varias propiedades y métodos para mostrar cuántos subprocesos hay disponibles, máximos, etc. Intentaré monitorear esos conteos para ver si parece que el ThreadPool se está extendiendo.

Si es, entonces la mejor resolución es garantizar que el ThreadPool solo se utilice para tareas de corta duración (pequeñas). Si se está utilizando para tareas de larga ejecución, entonces esas tareas deberían modificarse para usar su propio hilo dedicado en lugar de ocupar ThreadPool.

+0

Hola STW, ¿Cómo se supervisan los parámetros de ThreadPool? Encuesta o algo más? Gracias! – Maanu

+0

Puede utilizar un temporizador simple, como 'System.Threading.Timer' para invocar un método que podría recopilar e informar sobre el estado del subproceso – STW

+0

... No era consciente de esto, pero también parece que puede haber contadores de rendimiento disponibles específicamente para hacer esto: http://msdn.microsoft.com/en-us/library/ff650682.aspx – STW