2010-08-24 8 views
20

Cuando llama al método BeginInvoke en un delegado de Func (o la Acción delega para el caso) en C#, ¿utiliza el tiempo de ejecución el ThreadPool o engendra un nuevo hilo?¿Func <T> .BeginInvoke usa ThreadPool?

Estoy casi seguro de que usará el ThreadPool porque sería lo lógico pero agradecería que alguien pudiera confirmarlo.

Gracias,

Respuesta

29

Utiliza el grupo de subprocesos, definitivamente.

estoy blowed si puedo encontrar la documentada de todos modos, que conste ... this MSDN article indica que cualquier de devolución de llamada que especifique se ejecuta en un hilo de rosca de la piscina ...

Aquí hay un código de confirmarlo - pero por supuesto que no confirma que se trata de garantizado a suceder de esa manera ...

using System; 
using System.Threading; 

public class Test 
{ 
    static void Main() 
    { 
     Action x =() => 
      Console.WriteLine(Thread.CurrentThread.IsThreadPoolThread); 

     x(); // Synchronous; prints False 
     x.BeginInvoke(null, null); // On the thread-pool thread; prints True 
     Thread.Sleep(500); // Let the previous call finish 
    } 
} 

EDIT: Como ligado por Jeff continuación, this MSDN article lo confirma:

Si el método se llama BeginInvoke, el común Language Runtime (CLR) colas de la solicitud y devuelve inmediatamente a la persona que llama. El método de destino se llama asincrónicamente en un subproceso desde el grupo de subprocesos.

+8

De [Programación asincrónica mediante delegados] (http://msdn.microsoft.com/en-us/library/22t547yb.aspx): "Si se llama al método BeginInvoke, el tiempo de ejecución de lenguaje común (CLR) coloca en cola la solicitud y regresa inmediatamente a la persona que llama. El método de destino se llama asíncronamente en un hilo del grupo de subprocesos ". –

+0

@Jeff: Gracias. No encontré esa página antes. Debidamente vinculado. –

-6

"Ejecuta el delegado especificado de forma asincrónica en el subproceso en el que se creó el identificador subyacente del control". - MSDN

Lo anterior es para Controles, pero probablemente se asuma que es la misma funcionalidad para Func también. BeginInvoke le permite ejecutar su Func desde otro Thread, pero no creará hilos por usted. Entonces Jon Skeet estaría en lo cierto. A menos que esté creando subprocesos para la ejecución asincrónica, ni siquiera usaría esta función porque no le comprará nada más que llamar a Invoke.

+4

No, definitivamente * no se puede * suponer que es la misma funcionalidad para los delegados. No existe tal cosa como "el hilo en el que se creó el identificador subyacente del control" para los delegados. Control.BeginInvoke y Delegate.BeginInvoke son muy diferentes. –

+1

De hecho ... a veces en archivos grandes con malas convenciones de nomenclatura _someControl.BeginInvoke podría confundirse con _someAction.BeginInvoke –

Cuestiones relacionadas