2010-03-15 9 views
6

¿Hay alguna diferencia esencial entre este código:.NET pregunta roscado

ThreadStart starter = new ThreadStart(SomeMethod); 
starter.Invoke(); 

y esto?

ThreadStart starter = new ThreadStart(SomeMethod); 
Thread th = new Thread(starter); 
th.Start(); 

¿O el primero invoca el método en el hilo actual mientras que el segundo lo invoca en un nuevo hilo?

+3

En realidad, no está haciendo una pregunta relacionada con la rosca. El meollo de su pregunta es: "¿Qué hace el método Delegate.Invoke?" Responde eso y tendrás tu respuesta. –

+0

En cualquier caso, si tiene acceso, debe olvidar la API de subprocesos e ir a las tareas una :) –

Respuesta

13

No son lo mismo.

Llamar a new ThreadStart(SomeMethod).Invoke() ejecutará el método en la secuencia actual usando el enlace tardío. Esto es mucho más lento que new ThreadStart(SomeMethod)(), que a su vez es un poco más lento que SomeMethod().

Llamando new Thread(SomeMethod).Start() creará un nuevo hilo (con su propia pila), ejecutará el método en el hilo y luego destruirá el hilo.

Calling ThreadPool.QueueUserWorkItem(delegate { SomeMethod(); }) (que usted no mencionó) se ejecutará el método en el fondo en el grupo de subprocesos, que es un conjunto de hilos manejados automáticamente por .Net que puede ejecutar código en. Usar ThreadPool es mucho más barato que crear un nuevo hilo.

Llamar a BeginInvoke (que tampoco mencionó) también ejecutará el método en segundo plano en el grupo de subprocesos, y guardará información sobre el resultado del método hasta que llame al EndInvoke. (Después de llamar BeginInvoke, que necesidad llamada EndInvoke)

En general, la mejor opción es ThreadPool.QueueUserWorkItem.

+0

¿Por qué se modificó esta opción? – SLaks

+1

No es realmente válido decir que una de las opciones es mejor que las demás. Ellos hacen cosas diferentes. Los hilos ThreadPool son para artículos de trabajo finitos de alta rotación. Nuevos hilos son cuando quieres un hilo nuevo. (sin embargo, yo no era el votante a la baja) –

+1

+1 de mí. Impresionante explicación. –

3

En respuesta casos SLaks' no está totalmente claro:

qué la primera invoque el método en el subproceso actual, mientras que la segunda lo invoca en un nuevo hilo?

Sí.

+3

Pensé que eso estaba claro. – SLaks

+0

En ocasiones, demasiada información es abrumadora, así que le di la opción de una respuesta directa a su pregunta. Yo voté por encima de tu respuesta por cierto. – Foole