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 se enlazan a un subproceso concreto y no son seguros para subprocesos.Controls in Windows Forms are bound to a specific thread and are not thread safe. Por consiguiente, si llama al método de un control desde un subproceso diferente, debe utilizar uno de los métodos de invocación del control para calcular las referencias de 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 se puede utilizar para determinar si se debe llamar a un método de invocación, lo que puede ser útil si no se sabe qué subproceso es el propietario de 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 de la InvokeRequired propiedad, hay cuatro métodos en un control que son seguros para que los subprocesos llamen a CreateGraphics : Invoke,BeginInvoke EndInvoke y 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. La CreateGraphics llamada a antes de que el identificador del control se haya creado en un subproceso en segundo plano puede producir llamadas cruzadas no válidas.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Para todas las demás llamadas al método, debe usar uno de estos métodos de invocación al llamar a 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 todavía no existe, InvokeRequired busca en la cadena primaria del control 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 método devuelve 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 el control se creó 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 de que aún no se haya creado el identificador del control, no debe llamar simplemente 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 hacer que el identificador del control se cree en el subproceso en segundo plano, aislando el control en un subproceso sin un bombeo de mensajes y haciendo que la aplicación sea 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 protegerse en este caso comprobando 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 haya creado antes de Invoke llamar BeginInvokea o.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 ( Application.Run(new MainForm())como en, antes de que el formulario Application.Run se haya mostrado o se haya llamado a).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 consiste en esperar hasta que se haya 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. Fuerce la creación de identificadores llamando Handle a la propiedad o espere hasta Load que el evento inicie 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

Podría producirse una excepción si el subproceso que deberí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, consulte cómo: Utilice un subproceso en segundo plano para buscar archivos y cómo: Realice llamadas seguras para subprocesos acontroles de 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: