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

Definição

Obtém um valor que indica se o chamador deve chamar um método invoke ao fazer chamadas de método para o controle porque o chamador está em um thread diferente daquele no qual o controle foi criado.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 da propriedade

true se o controle Handle tiver sido criado em um thread diferente do thread de chamada (indicando que você deve fazer chamadas para o controle por meio de um método invoke); caso contrário, 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.

Implementações

Comentários

Os controles no Windows Forms são associados a um thread específico e não são thread-safe.Controls in Windows Forms are bound to a specific thread and are not thread safe. Portanto, se você estiver chamando um método de controle de um thread diferente, deverá usar um dos métodos Invoke do controle para realizar o marshaling da chamada para o thread apropriado.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. Essa propriedade pode ser usada para determinar se você deve chamar um método Invoke, que pode ser útil se você não souber qual thread possui um controle.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.

Observação

Além InvokeRequired da propriedade, há quatro métodos em um controle que são thread-safe para chamar: Invoke,BeginInvoke EndInvoke e CreateGraphics se o identificador do controle já foi criado.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. Chamar CreateGraphics antes de o identificador do controle ter sido criado em um thread em segundo plano pode causar chamadas ilegais entre threads.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Para todas as outras chamadas de método, você deve usar um desses métodos de invocação ao chamar de um thread diferente.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Se o identificador do controle ainda não existir, InvokeRequired o pesquisará a cadeia pai do controle até encontrar um controle ou formulário que tenha um identificador de janela.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. Se nenhum identificador apropriado puder ser encontrado, o InvokeRequired método retornará false.If no appropriate handle can be found, the InvokeRequired method returns false.

Isso significa que InvokeRequired pode retornar false se Invoke não for necessário (a chamada ocorre no mesmo thread) ou se o controle foi criado em um thread diferente, mas o identificador do controle ainda não foi criado.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.

No caso em que o identificador do controle ainda não foi criado, você não deve simplesmente chamar Propriedades, métodos ou eventos no controle.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. Isso pode fazer com que o identificador do controle seja criado no thread em segundo plano, isolando o controle em um thread sem uma bomba de mensagem e tornando o aplicativo instável.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.

Você pode se proteger contra esse caso, verificando também o IsHandleCreated valor InvokeRequired de false quando retorna em um thread em segundo plano.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Se a alça de controle ainda não tiver sido criada, você deverá aguardar até que ela tenha sido Invoke criada BeginInvokeantes de chamar ou.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Normalmente, isso ocorrerá somente se um thread em segundo plano for criado no construtor do formulário primário para o aplicativo (como Application.Run(new MainForm())no, antes que o formulário tenha sido Application.Run mostrado ou tenha sido chamado.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.

Uma solução é aguardar até que o identificador do formulário tenha sido criado antes de iniciar o thread em segundo plano.One solution is to wait until the form's handle has been created before starting the background thread. Force a criação do identificador chamando a Handle propriedade ou aguarde até que o Load evento inicie o processo em segundo plano.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Uma solução ainda melhor é usar o SynchronizationContext retornado por SynchronizationContext em vez de um controle para o empacotamento entre threads.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Observação

Uma exceção poderá ser gerada se o thread que deve processar a mensagem não estiver mais ativo.An exception might be thrown if the thread that should process the message is no longer active.

Para obter mais informações sobre controles de Windows Forms multithread, consulte Como: Use um thread em segundo plano para pesquisar arquivos e como: Faça chamadas de thread-safe para Windows Formscontroles.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.

Aplica-se a

Veja também