2011-04-07 22 views
8

En mi aplicación WPF, quiero hacer algo de trabajo en un hilo que no sea UI para evitar que la IU no responda. Para que hice esto:¿BeginInvoke() ejecuta un hilo separado?

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType); 
caller.BeginInvoke(_patterns, null, null); 

y el delegado se define como,

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data); 

Mi pregunta es:

¿Tiene BeginInvoke() crear un nuevo hilo y la devolución de llamada SetPatternType carreras en ella? Si es así, ¿cuánto tiempo dura este hilo?

¿Este enfoque es bueno en general? Si no, ¿qué tiene de malo? ¿Y qué problema (s) potencial (es) podría enfrentar?

estoy usando C# 4.0 y Visual Studio 2010.


EDIT:

También necesito algunas pautas con respecto a éstos:

cuando debería crear un nuevo hilo a mí mismo y cuando ¿Debo hacer uso de BeginInvoke()? ¿Y cuándo debería usar el objeto DispatcherObject.Dispatcher.BeginInvoke()?

+0

¿Qué versión .NET utiliza? – PVitt

+0

@PVitt: Creo ... Estoy usando .NET 4.0 ya que estoy usando Visual Studio 2010. – Nawaz

Respuesta

10

Es técnicamente not a new thread es un hilo de Threadpool, y migth dura más tiempo que su proceso/programa, pero podría ejecutar algunos otros hilos asynch llamadas inmediatamente termina el suyo. Consulte los artículos de MSDN en Asynch Programming y Threadpool para obtener los detalles completos.

Y dependiendo de su interés, compruebe I/O CompletionPort para obtener más detalles.

La programación de Asynch generalmente se considera mejor que el código sincrónico al menos, pero si está en .NET 4.0 eche un vistazo a Task Parallel Library.

Basado en la Pregunta Editar, ¿cuándo debería crear mi propio hilo? Siempre es mejor utilizar la programación de BeginInvoke o Async en comparación con la creación de su propio hilo. Cree estrictamente su propio hilo cuando esté seguro de que necesita un hilo dedicado para hacer alguna tarea/trabajo de forma continua y tenga en claro la mecánica de sincronización que necesitan los hilos múltiples en su aplicación. Evite crear nuevos temas todo el tiempo que pueda a menos que tenga una razón realmente convincente. Agregas un hilo hoy y probablemente sigas adelante y, después de dos años, tres desarrolladores ven que se agregó un hilo adicional para algunas cosas continuas, agregarán algunas más, y así sucesivamente. Confía en mí. He visto que esto sucede, por lo tanto, establezco las prácticas correctas (es decir, usando métodos Asynch) y la gente tratará de seguir eso. He visto aplicaciones con 150 subprocesos, ¿tiene sentido en una máquina de doble núcleo o cuádruple núcleo, no lo creo.

Acabo de comprobar todos los procesos en ejecución en mi portátil Toshiba para aplicaciones mal diseñadas, Toshiba Bluetooth Manager gana la corona del peor programa diseñado en mi caja con 53 hilos. :)

8

Utiliza el grupo de subprocesos, por lo que no creará necesariamente un nuevo subproceso, pero se ejecutará en un subproceso diferente al de la llamada (a menos que sea un subproceso de subproceso que finalice su tarea antes del la invocación de delegado está programada; sería bastante improbable que use el mismo hilo).

+1

¿Qué sugieres? ¿Es este un buen enfoque? Ver la edición en mi pregunta. – Nawaz

+0

@Nawaz: probablemente sea mejor dejar una pregunta por separado. De hecho, [¿Cuándo usar un grupo de subprocesos?] (Http://stackoverflow.com/questions/145304/when-to-use-threadpool-in-c) podría ayudar. – ladenedge

+0

@Nawaz: Realmente no has dicho cuál es el objetivo, por lo que es difícil saber si es o no un buen enfoque. Sin embargo, es muy diferente de utilizar Dispatcher.BeginInvoke, es decir, ejecutar un delegado en un subproceso * específico * (UI). –

2

Despachador.CurrentDispatcher es algo nuevo en WPF (algo que reemplaza a InvokeRequired en WinForms).

Puede utilizar Dispatcher que hacer cola las actualizaciones que desee a la interfaz gráfica de usuario y tiene diferentes prioridades se puede elegir entre

ver this MSDN link

Cuestiones relacionadas