Explicamos con un ejemplo cómo implementar la ejecución de un proceso o tarea en segundo plano con el lenguaje de programación Microsoft Visual Basic .Net 2010. Mostramos el código fuente (source code) de una aplicación de ejemplo que ejecuta un proceso en segundo plano con barra de progreso usando el componente BackgroundWorker.

Hilo de ejecución, Threads

Un hilo de ejecución o subproceso es una característica que permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Un hilo es básicamente una tarea que puede ser ejecutada en paralelo con otra tarea.

Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente.

Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el estado de la CPU (incluyendo el valor de los registros).

El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.

Componente BackgroundWorker en Visual Basic .Net VB.Net

El componente BackgroundWorker permite que el formulario o control ejecute operaciones de forma asincrónica. Proporciona la posibilidad de ejecutar operaciones que llevan mucho tiempo de forma asincrónica («en segundo plano»), en un subproceso distinto del subproceso de la IU principal de la aplicación.

La clase BackgroundWorker permite ejecutar una operación en un subproceso dedicado e independiente. Durante la ejecución de operaciones que exigen mucho tiempo, como las descargas y las transacciones de las bases de datos, puede parecer que la interfaz de usuario (UI) ha dejado de responder. Cuando se necesita una interfaz de usuario rápida, pero se producen largos retrasos asociados a tales operaciones, la clase BackgroundWorker ofrece una práctica solución.

Para ejecutar en segundo plano una operación que exija mucho tiempo, cree un objeto BackgroundWorker y realice escuchas de eventos que creen informes del progreso de la operación y que señalen su finalización. Se puede crear BackgroundWorker mediante programación o arrastrarlo al formulario desde la ficha Componentes del Cuadro de herramientas. Si crea BackgroundWorker en el Diseñador de Windows Forms, aparecerá en la Bandeja de componentes y sus propiedades se mostrarán en la ventana Propiedades.

Diseño del formulario Microsoft Visual Basic .Net VB.Net

Para el formulario de ejemplo de uso del componente BackgroundWorker (en el formulario llamado «hiloSegundoPlano») añadiremos los siguientes componentes:

  • NumericUpDown: para establecer el número de iteraciones de la función de Fibonacci que será la usada en el ejemplo para realizar un cálculo que tarde un tiempo determinado y así probar el proceso en segundo plano.
  • Label: mostrará el estado de la tarea ejecutada en segundo plano o background.
  • ProgressBar: barra de progreso que mostrará el porcejate completado de la tarea en segundo plano.
  • Button: botón para iniciar el proceso en segundo plano.
  • Button: botón para cancelar el proceso en segundo plano ejecutado.
  • TextBox: donde el usuario podrá escribir para comprobar que el proceso en segundo plano se está ejecutando y se puede, a su vez, interactuar con el formulario.
  • Button: para limpiar el contenido del TextBox anterior.
  • Button: para guardar el contenido del TextBox anterior, incluso aunque se esté ejecutando el proceso en segundo plano.
  • BackgroundWorker: componente para generar el hilo o proceso en segundo plano, asíncrono o background.
  • SaveFileDialog: componente para mostrar una ventana de petición de unidad, carpeta y nombre del fichero a guardar.
Diseño del formulario Microsoft Visual Basic .Net VB.Net

Estableceremos a True las propiedades WorkerReportsProgress y WorkerSupportsCancellation del componente BackgroundWorker:

Diseño del formulario Microsoft Visual Basic .Net VB.Net

Desarrollar aplicación con subproceso en segundo plano o asíncrono con Visual Basic .Net

En primer lugar crearemos un proyecto basado en Windows, desde el menú «Archivo» – «Nuevo proyecto», seleccionando «Aplicación de Windows Forms». Añadiremos los componentes que indicamos aquí al formulario principal de la aplicación.

Crearemos el procedimiento o función que será la que realice la acción que queramos ejecutar en proceso en segundo plano. Es importante mencionar que en dicho procedimiento o función no se puede hacer referencia a controles del formulario. Por ejemplo, si queremos mostrar una barra de progreso con el estado de la tarea, deberemos hacer referencia a la barra de progreso en el evento ProgressChanged del componente BackgroundWorker, si intentamos hacer una referencia a algún componente del formulario desde el procedimiento o función se producirá un error.

Añadiremos dicho procedimiento, en nuestro caso un ejemplo de cálculo de la Sucesión de Fibonacci:

En la función anterior hemos incluido las líneas de código:

Para controlar si el usuario ha pulsado el botón cancelar, de esta forma cancelaremos el proceso en segundo plano.

También la línea:

Para devolver el porcentaje actual del progreso.

Como se puede observar en el código de la función, nunca se hace referencia a un componente del formulario.

Por otro lado en el evento DoWork del componente BackgroundWorker, agregaremos una llamada al método CalcularFibonacci:

En el procedimiento anterior (DoWork) ejecutaremos la función CalcularFibonacci pasándole varios parámetros para permitir la cancelación del proceso y para mostrar la información del progreso.

Es importante que el controlador de eventos DoWork no haga referencia directamente a la variable de la instancia BackgroundWorker (en el ejemplo llamado «hiloSegundoPlano»), ya que esto uniría este controlador de eventos a una instancia específica de BackgroundWorker. En su lugar, se recupera del parámetro sender una referencia al control BackgroundWorker que provocó este evento. Esto es importante cuando el formulario aloje más de un BackgroundWorker.

Para implementar la información de progreso, declaremos tres variables en el formulario formProceso. Éstas se utilizarán para realizar el seguimiento del progreso:

En el evento ProgressChanged del componente BackgroundWorker añadiremos el siguiente código:

Para permitir que el usuario pueda cancelar el proceso en segundo plano, en el evento OnClick del botón btCancelarProceso introduciremos el siguiente código:

Con estos procedimientos habremos conseguido ejecutar la función deseada (CalcularFibonacci) que puede realizar cualquier acción en segundo plano, de forma que de cara al usuario la función o procedimiento se ejecutará «sin que se entere» (si así lo deseamos). Podrá seguir interactuando con nuestra aplicación mientras se ejecuta la tarea en segundo plano. Este método es muy útil para determinados procesos donde consideremos que el usuario ni tiene que interactuar, mejorando así el rendimiento de nuestra aplicación.

Código fuente source code completo de aplicación con thread o hilo asíncrono con Visual Basic .Net VB.Net

A continuación mostramos el código fuente completo en Microsoft Visual Basic .Net de Microsoft Visual Studio 2010, como ejemplo de ejecución de tareas en segundo plano o asíncronas, con barra de progreso:

La aplicación AjpdSoft Proceso segundo plano con progreso VB.Net en funcionamiento

Tras seleccionar el número de iteraciones y pulsar en «Iniciar proceso asíncrono» se iniciará el proceso, mostrará la barra de progreso y se activará el botón «Cancelar proceso asíncrono». Si queremos probar que el proceso se ejecuta en segundo plano realmente y que podemos interactuar con la aplicación, podremos escribir en el cuadro de texto y guardar los cambios mientras el proceso se está ejecutando:

Si eres desarrollador de software y quieres descargar el ejemplo complento en Microsoft Visual Basic .Net 2010 regístrate en nuestra web y accede al enlace: