Compartir a través de


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

  1. 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);
    
  2. 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

Referencia

BackgroundWorker

Otros recursos

Subprocesamiento múltiple en componentes