Control.InvokeRequired Propiedad

Definición

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ó.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Valor de propiedad

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, false.

Implementaciones

Atributos

Comentarios

Los controles de Windows Forms están enlazados a un subproceso específico y no son seguros para subprocesos. Por lo tanto, si llama al método de un control desde un subproceso diferente, debe usar uno de los métodos de invocación del control para serializar la llamada al subproceso adecuado. Esta propiedad se puede usar para determinar si debe llamar a un método invoke, lo que puede ser útil si no sabe qué subproceso posee un control.

Nota

Además de la InvokeRequired propiedad , hay cuatro métodos en un control que son seguros para subprocesos para llamar a: Invoke,BeginInvokeEndInvoke y CreateGraphics si el identificador del control ya se ha creado. Llamar CreateGraphics a antes de que se haya creado el identificador del control en un subproceso en segundo plano puede provocar llamadas ilegales entre subprocesos. Para todas las demás llamadas de método, debe usar uno de estos métodos de invocación al llamar desde un subproceso diferente.

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

Esto significa que InvokeRequired puede devolver false si Invoke no es necesario (la llamada se produce en el mismo subproceso) o si el control se creó en un subproceso diferente, pero el identificador del control aún no se ha creado.

En caso de que el identificador del control aún no se haya creado, no debe llamar simplemente a propiedades, métodos o eventos en el control. Esto puede hacer que el identificador del control se cree en el subproceso en segundo plano, aislando el control en un subproceso sin una bomba de mensajes y haciendo que la aplicación sea inestable.

También puede proteger contra este caso comprobando el valor de IsHandleCreated cuando InvokeRequired devuelve false en un subproceso en segundo plano. Si aún no se ha creado el identificador de control, debe esperar hasta que se haya creado antes de llamar a Invoke o BeginInvoke. Normalmente, esto sucede solo si se crea un subproceso en segundo plano en el constructor del formulario principal de la aplicación (como en Application.Run(new MainForm()), antes de que se haya mostrado o Application.Run se haya llamado al formulario.

Una solución consiste en esperar hasta que se haya creado el identificador del formulario antes de iniciar el subproceso en segundo plano. Puede forzar la creación mediante una llamada a la Handle propiedad o espere hasta que el Load evento inicie el proceso en segundo plano.

Una solución aún mejor es usar el SynchronizationContext devuelto por SynchronizationContext en lugar de un control para la serialización entre subprocesos.

Nota

Es posible que se produzca una excepción si el subproceso que debe procesar el mensaje ya no está activo.

Para obtener más información sobre los controles de Windows Forms multiproceso, vea How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

Se aplica a

Consulte también