Cómo: Manipular controles a partir de subprocesos
Actualización: noviembre 2007
Aunque el componente BackgroundWorker viene a reemplazar y a agregar funcionalidad al método BeginInvoke, éste se conserva a efectos de compatibilidad con versiones anteriores y uso futuro, según sea el caso. Para obtener más información, vea Información general sobre el componente BackgroundWorker.
El subprocesamiento múltiple se ajusta mejor a la ejecución de procedimientos de módulos de clases que realicen un uso intensivo del procesador. A diferencia de otros componentes, existen problemas para llamar directamente a los métodos de los controles de otros subprocesos, por lo que los métodos que afectan a los controles deberían ejecutarse sólo en el subproceso en el que fueron creados. Debido a que la realización de llamadas de cálculo de referencias (marshalling) desde un subproceso y su envío fuera de los límites del mismo a otro subproceso resultan muy costosas en cuanto a recursos del sistema, se debería evitar realizar llamadas repetidamente a controles de otros subprocesos. En el mejor de los casos, las llamadas directas desde otros subprocesos resultan costosas ya que afectan al rendimiento de la aplicación. En el peor de los casos, se puede producir un interbloqueo en la aplicación, que paralizará su ejecución.
Sin embargo, puede haber ocasiones en que se desee invocar a métodos de controles desde los subprocesos. Por ejemplo, se podría llamar a un método que deshabilite un botón o actualice una presentación en un formulario como respuesta a una acción emprendida por un subproceso. .NET Framework proporciona métodos a los que resulta seguro invocar desde cualquier subproceso para llamar a métodos que interactúen con controles de otros subprocesos. El método Invoke permite la ejecución sincrónica de métodos en los controles, mientras que el método BeginInvoke inicia la ejecución asincrónica. Para usar estos métodos, se deberá declarar un delegado con la misma firma que el método que se invocará. A continuación, se puede llamar al método Invoke o BeginInvoke de cualquier control del formulario si se suministra el delegado apropiado al método que se desea llamar. Cualquier parámetro requerido se incluye en un objeto Object y se transmite al método.
Para invocar a métodos que impliquen a controles de otros subprocesos
Declare un delegado con una firma idéntica a la del método al que desea invocar.
El ejemplo siguiente muestra cómo declarar un delegado con parámetros Integer y String.
Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _ aString as String)
public delegate void myDelegate(int anInteger, string aString);
Use cualquier control para invocar a métodos que manipulen controles de otros subprocesos.
Nota: Los parámetros requeridos (si hay alguno) por el método pueden suministrarse dentro de un objeto Object.
Si desea realizar llamadas a métodos de forma sincrónica, llame al método Control.Invoke.
Label1.Invoke(New myDelegate(AddressOf myMethod), New _ Object() {1, "This is the string"})
Label1.Invoke(new myDelegate(myMethod), new Object[] {1, "This is the string"});
Si desea realizar llamadas a métodos de forma asincrónica, llame al método Control.BeginInvoke.
Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _ New Object() {1, "This is the string"})
Label1.BeginInvoke(new myDelegate(myMethod), new Object[] {1, "This is the string"});
Vea también
Tareas
Tutorial: Crear un componente sencillo con múltiples procesos en Visual Basic
Tutorial: Crear un componente sencillo con múltiples procesos en Visual C#
Conceptos
Información general sobre el modelo asincrónico basado en eventos