Control.InvokeRequired Propiedad
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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.