Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Property

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ó.Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
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.true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

Implementaciones

Comentarios

Los controles de Windows Forms están enlazados a un subproceso específico y no son seguros para subprocesos.Controls in Windows Forms are bound to a specific thread and are not thread safe. Por lo tanto, si se llama a un método de control desde un subproceso diferente, debe usar uno del control invocara métodos para serializar la llamada al subproceso adecuado.Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. Esta propiedad puede utilizarse para determinar si debe llamarse a un método de invocación, que puede ser útil si no sabe qué subproceso posee un control.This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

Nota

Además el InvokeRequired propiedad, hay cuatro métodos en un control que es seguro para subprocesos llamar a: Invoke,BeginInvoke, EndInvoke y CreateGraphics si ya se ha creado el identificador del control.In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. Una llamada a CreateGraphics antes de que se ha creado el identificador del control en un subproceso en segundo plano puede provocar no válidas entre las llamadas de subprocesos.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Todas las demás llamadas de método, debe usar uno de estos métodos de invocación cuando una llamada desde un subproceso diferente.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Si el identificador del control no existe todavía, InvokeRequired búsquedas de seguridad de la cadena del control primario hasta que encuentra un control o formulario que tiene un identificador de ventana.If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. Si no se encuentra ningún identificador adecuado, el InvokeRequired devuelve del método false.If no appropriate handle can be found, the InvokeRequired method returns false.

Esto significa que InvokeRequired puede devolver false si Invoke no es necesario (la llamada se produce en el mismo subproceso), o si se creó el control en un subproceso diferente, pero aún no se ha creado el identificador del control.This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

En el caso donde el identificador del control ha no se han creado, debe no basta con llamar a propiedades, métodos o eventos en el control.In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. Esto puede provocar que el identificador del control que se crearán en el subproceso en segundo plano, aislar el control en un subproceso sin un bombeo de mensajes y hacer que la aplicación inestable.This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

Puede proteger con respecto a este caso, compruebe también el valor de IsHandleCreated cuando InvokeRequired devuelve false en un subproceso en segundo plano.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Si aún no se ha creado el identificador de control, debe esperar hasta que se ha creado antes de llamar a Invoke o BeginInvoke.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Normalmente, esto solo sucede 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 haya demostrado el formulario o Application.Run se ha llamado.Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

Una solución es esperar hasta que se ha creado el identificador del formulario antes de iniciar el subproceso en segundo plano.One solution is to wait until the form's handle has been created before starting the background thread. Ya sea forzar la creación de identificador mediante una llamada a la Handle propiedad o espere a que el Load evento para iniciar el proceso en segundo plano.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Una solución aún mejor es usar el SynchronizationContext devuelto por SynchronizationContext en lugar de un control para la serialización entre subprocesos.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Nota

Es posible que se produce una excepción si el subproceso que se va a procesar el mensaje ya no está activo.An exception might be thrown if the thread that should process the message is no longer active.

Para obtener más información acerca de los controles de Windows Forms multiproceso, vea Cómo: Usar un subproceso en segundo plano para buscar archivos y Cómo: Realizar llamadas seguras para subprocesos a controles de formularios Windows Forms.For more information about multithreaded Windows Forms controls, see 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: