Compartir a través de


Aplicaciones multiproceso

Actualización: noviembre 2007

Con Visual Basic, puede crear aplicaciones que realicen varias tareas de forma simultánea. Las tareas con la posibilidad de mantener otras tareas pueden ejecutarse en subprocesos separados, un proceso que se conoce como subprocesamiento múltiple o subprocesamiento libre.

Las aplicaciones que utilizan el subprocesamiento múltiple son más receptivas a los datos proporcionados por el usuario porque la interfaz de usuario permanece activa cuando se ejecutan tareas con un consumo de procesador elevado en subprocesos independientes. El subprocesamiento múltiple también es útil cuando se crean aplicaciones escalables, porque se pueden agregar subprocesos a medida que aumenta la carga de trabajo.

Utilizar el componente BackgroundWorker

La manera más confiable de crear una aplicación multiproceso consiste en utilizar el componente BackgroundWorker. Esta clase administra un subproceso independiente dedicado a procesar el método que se especifique. Para obtener un ejemplo, vea Tutorial: Subprocesamiento múltiple.

Para iniciar una operación en segundo plano, cree un componente BackgroundWorker que escuche los eventos que indican el progreso de la operación y señale la finalización de la operación. Puede crear el objeto BackgroundWorker mediante programación o puede arrastrarlo al formulario desde la ficha Componentes del Cuadro de herramientas. Si crea BackgroundWorker en el Diseñador de formularios, aparece en la Bandeja de componentes y sus propiedades se muestran en la ventana Propiedades.

Configuración para una operación en segundo plano

Para preparar una operación en segundo plano, agregue un controlador de eventos al evento DoWork. Llame a la operación que consume tiempo en este controlador de eventos.

Para iniciar la operación, llame a RunWorkerAsync. Para recibir notificaciones de actualizaciones del progreso, controle el evento ProgressChanged. Para recibir una notificación cuando finalice la operación, controle el evento RunWorkerCompleted.

Los métodos que controlan los eventos ProgressChanged y RunWorkerCompleted pueden tener acceso a la interfaz de usuario de la aplicación, ya que se inician en el subproceso que ha llamado el método RunWorkerAsync. Sin embargo, el controlador de eventos DoWork no puede trabajar con ningún objeto de la interfaz de usuario porque se ejecuta en el subproceso en segundo plano.

Crear y usar subprocesos

Si necesita más control sobre el comportamiento de los subprocesos de la aplicación, puede administrar los subprocesos personalmente. Sin embargo, debe ser consciente de que escribir aplicaciones multiproceso correctas puede ser difícil: la aplicación puede dejar de responder o experimentar errores transitorios debido a las condiciones de anticipación. Para obtener más información, vea Componentes seguros para subprocesos.

En Visual Basic se puede crear un subproceso mediante la declaración de una variable del tipo Thread y la llamada al constructor con la instrucción AddressOf y el nombre del procedimiento o método que se desea ejecutar en el nuevo subproceso. El código siguiente proporciona un ejemplo:

Dim TestThread As New System.Threading.Thread(AddressOf TestSub)

Iniciar y detener subprocesos

Para iniciar la ejecución de un nuevo subproceso, utilice el método Start, como en el código siguiente:

TestThread.Start()

Para detener la ejecución de un subproceso, utilice el método Abort, como en el código siguiente:

TestThread.Abort()

Además de iniciar y detener subprocesos, también se pueden realizar pausas en los subprocesos llamando a los métodos Sleep o Suspend, reanudar un subproceso suspendido con el método Resume y destruir un subproceso mediante el método Abort, como en el código siguiente:

TestThread.Sleep(1000)
TestThread.Abort()

Métodos de subproceso

En la tabla siguiente se muestran algunos de los métodos que se pueden usar para controlar subprocesos individuales.

Método

Acción

Start

Inicia la ejecución de un subproceso.

Sleep

Hace una pausa en la ejecución de un subproceso durante un período de tiempo determinado.

Suspend

Hace una pausa en la ejecución de un subproceso cuando alcanza un punto seguro.

Abort

Detiene un subproceso cuando alcanza un punto seguro.

Resume

Reinicia un subproceso suspendido

Join

Hace que el subproceso actual espere a que termine otro subproceso. Si se utiliza con un valor de tiempo de espera, este método devuelve True cuando el subproceso termina en el tiempo asignado.

Puntos seguros

La mayoría de estos métodos son autoexplicativos, pero es posible que el concepto de puntos seguros resulte nuevo. Los puntos seguros son ubicaciones del código donde Common Language Runtime puede realizar, de forma automática y segura, la recolección de elementos no utilizados (el proceso de liberar variables no utilizadas y reclamar memoria). Cuando se llama a los métodos Abort o Suspend de un subproceso, Common Language Runtime analiza el código y determina la ubicación de un lugar adecuado para que el subproceso detenga su ejecución.

Propiedades de subprocesos

Los subprocesos contienen también varias propiedades útiles, como se muestra en la tabla siguiente:

Propiedad

Valor

IsAlive

Contiene el valor True si un subproceso está activo.

IsBackground

Obtiene o establece un valor de tipo Boolean que indica si un subproceso está o debe estar en segundo plano. Los subprocesos en segundo plano son como los de primer plano, pero los de segundo plano no impiden que se termine un proceso. Una vez terminados todos los subprocesos en primer plano pertenecientes a un proceso, Common Language Runtime termina el proceso mediante una llamada al método Abort en los subprocesos en segundo plano que continúan activos.

Name

Obtiene o establece el nombre de un subproceso. Suelen utilizarse para detectar subprocesos individuales durante la depuración.

Priority

Obtiene o establece un valor que el sistema operativo utiliza para asignar prioridades en la programación de subprocesos.

ApartmentState

Obtiene o establece el modelo de subprocesos utilizado para un subproceso en particular. Los modelos de subprocesos son importantes cuando un subproceso llama a código no administrado.

ThreadState

Contiene un valor que describe el estado o estados de un subproceso.

Vea Estados de subprocesos para obtener más información acerca de los métodos y los estados de los subprocesos.

Prioridades de los subprocesos

Cada subproceso tiene una propiedad de prioridad, que determina qué porción de tiempo del procesador tarda en ejecutarse. El sistema operativo asigna mayores porciones de tiempo a los subprocesos de alta prioridad y menores a los subprocesos de baja prioridad. Los nuevos subprocesos se crean con el valor de Normal, pero puede cambiar la propiedad Priority a cualquier valor de la enumeración ThreadPriority.

Vea ThreadPriority para obtener una descripción detallada de las diversas prioridades de los subprocesos.

Subprocesos de primer y segundo plano

Un subproceso en primer plano se ejecuta de forma indefinida, mientras que un subproceso en segundo plano finaliza en cuanto el último subproceso en primer plano se detiene. Puede utilizar la propiedad IsBackground para determinar o cambiar el estado de segundo plano de un subproceso.

Vea también

Conceptos

Estados de subprocesos

Parámetros y valores devueltos para procedimientos multiproceso

Sincronización de subprocesos

Subprocesamiento múltiple con formularios y controles

Otros recursos

Subprocesamiento múltiple en componentes