Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

Control.InvokeRequired (Propiedad)

Obtiene un valor que indica si el llamador debe llamar a un método de invocación cuando realiza llamadas a métodos del control porque el llamador se encuentra en un subproceso distinto al del control donde se creó.

Espacio de nombres: System.Windows.Forms
Ensamblado: System.Windows.Forms (en system.windows.forms.dll)

public bool InvokeRequired { get; }
/** @property */
public final boolean get_InvokeRequired ()

public final function get InvokeRequired () : boolean

No aplicable.

Valor de propiedad

Es true si Handle del control se creó en un subproceso distinto al subproceso que realiza la llamada (lo que indica que debe realizar llamadas al control mediante un método de invocación); en caso contrario, es false.

Los controles de formularios Windows Forms están enlazados a un subproceso específico y no son seguros para la ejecución de subprocesos. Por lo tanto, si se llama a un método de un control desde un subproceso diferente, debe utilizarse uno de los métodos de invocación del control para calcular las referencias de la llamada al subproceso adecuado. Esta propiedad puede utilizarse para determinar si debe llamarse a un método de invocación, lo que puede resultar útil si se desconocen los subprocesos que poseen un control.

NotaNota:

Además de la propiedad InvokeRequired, en un control hay cuatro métodos se pueden llamar con seguridad para los subprocesos: Invoke, BeginInvoke, EndInvoke y CreateGraphics si ya se ha creado el identificador del control. La llamada a CreateGraphics antes de la creación del identificador del control en un subproceso de fondo puede producir llamadas no válidas entre subprocesos. Para el resto de las llamadas a métodos, sería conveniente utilizar uno de estos métodos de invocación cuando se realicen llamadas desde un subproceso diferente.

Si el identificador del control no existe todavía, InvokeRequired buscará en la cadena principal del control hasta que encuentre un control o un formulario que tenga un identificador de ventana. Si no se puede encontrar ningún identificador adecuado, el método InvokeRequired devuelve false.

Esto significa que InvokeRequired puede devolver false si no se requiere Invoke (la llamada se realiza en el mismo subproceso) o si el control se creó en un subproceso diferente pero todavía no se ha creado el identificador del control.

En caso de que todavía no se haya creado el identificador del control, no debe llamar a propiedades, métodos o eventos en el control. Esto podría hacer que el identificador del control se creara en el subproceso de fondo, aislando el control en un subproceso sin mensajes y haciendo que la aplicación fuera inestable.

Puede evitar este caso si comprueba también el valor de IsHandleCreated cuando InvokeRequired devuelve false en un subproceso de fondo. Si todavía no se ha creado el identificador del control, debe esperar hasta que se haya creado antes de llamar a Invoke o a BeginInvoke. Normalmente, esto sólo ocurre si se crea un subproceso de fondo en el constructor del formulario primario para la aplicación (como en Application.Run(new MainForm()), antes de que se haya mostrado el formulario o se haya llamado a Application.Run.

Una solución es esperar hasta que se haya creado el identificador del formulario antes de iniciar el subproceso de fondo. Fuerce la creación del identificador llamando a la propiedad Handle o espere hasta que el evento Load inicie el proceso de segundo plano.

Una solución aún mejor es utilizar el SynchronizationContext devuelto por SynchronizationContext en lugar de un control para el cálculo de referencias entre subprocesos.

NotaNota:

Podría iniciarse una excepción si el subproceso que debe procesar el mensaje ya no está activo.

Para obtener más información acerca de los controles de formularios Windows Forms multiproceso, vea Cómo: Utilizar un subproceso en segundo plano para buscar archivos.

Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 2.0
Mostrar:
© 2014 Microsoft