Compartir a través de


Agrupación de subprocesos

Actualización: noviembre 2007

La agrupación de subprocesos es una forma de multiproceso en la que las tareas se agregan a una cola y se inician automáticamente al crear los subprocesos. Con la agrupación de subprocesos, se llama al método ThreadPool.QueueUserWorkItem con un delegado para el procedimiento que se desea ejecutar y entonces Visual Basic crea el subproceso y ejecuta el procedimiento.

Ejemplo de agrupación de subprocesos

El ejemplo siguiente muestra cómo utilizar la agrupación de subprocesos para iniciar varias tareas.

Sub DoWork()
    ' Queue a task
    System.Threading.ThreadPool.QueueUserWorkItem( _
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task
    System.Threading.ThreadPool.QueueUserWorkItem( _
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub

La agrupación de subprocesos es útil cuando se desean iniciar muchas tareas diferentes sin establecer individualmente las propiedades de cada subproceso. Cada tarea se inicia con un tamaño de pila y una prioridad predeterminadas. De forma predeterminada, es posible ejecutar como máximo 25 subprocesos de agrupación por procesador del sistema. Es posible poner en cola subprocesos adicionales por encima del límite, pero no se iniciarán hasta que terminen otros subprocesos.

Una ventaja de la agrupación de subprocesos es que es posible pasar argumentos en un objeto de estado al procedimiento de tarea. Si el procedimiento al que se está llamando requiere más de un argumento, es posible convertir una estructura o una instancia de una clase en un tipo de datos Object.

Parámetros de agrupación de subprocesos y valores devueltos

Devolver valores desde un subproceso de agrupación de subprocesos no es sencillo. El modo estándar de devolver valores desde una llamada de función no está permitido, ya que los procedimientos Sub son los únicos que se pueden poner en la cola de una agrupación de subprocesos. Una manera de poder proporcionar parámetros y devolver valores consiste en empaquetar los parámetros, valores devueltos y métodos en una clase contenedora, como se explica en Parámetros y valores devueltos para procedimientos multiproceso.

Una forma más sencilla de proporcionar parámetros y valores devueltos es utilizar la variable opcional de objeto de estado ByVal del método QueueUserWorkItem. Si utiliza esta variable para pasar una referencia a una instancia de una clase, los miembros de la instancia podrán ser modificados por el subproceso de la agrupación de subprocesos, y utilizados como valores devueltos.

Al principio puede no ser obvio que es posible modificar un objeto al que hace referencia una variable que se pasa por valor. Esto se puede hacer porque sólo se pasa por valor la referencia de objeto. Cuando se hace algún cambio en los miembros del objeto al que se refiere la referencia de objeto, los cambios se aplican a la instancia real de la clase.

Las estructuras no se pueden utilizar para devolver valores dentro de objetos de estado. Dado que las estructuras son tipos de valor, los cambios que realiza el proceso asincrónico no modifican los miembros de la estructura original. Utilice estructuras para proporcionar parámetros cuando no se necesiten valores devueltos.

Vea también

Conceptos

Subprocesamiento múltiple avanzado con Visual Basic

Aplicaciones multiproceso

Sincronización de subprocesos

Subprocesamiento múltiple con formularios y controles

Referencia

QueueUserWorkItem

System.Threading

SyncLock (Instrucción)