Compartilhar via


Control.InvokeRequired Propriedade

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.

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

Implementações

Atributos

Comentários

Os controles em Windows Forms são associados a um thread específico e não são thread-safe. Portanto, se você estiver chamando o método de um controle de um thread diferente, deverá usar um dos métodos de invocação do controle para realizar marshaling da chamada para o thread apropriado. Essa propriedade pode ser usada para determinar se você deve chamar um método invoke, o que pode ser útil se você não souber qual thread possui um controle.

Observação

Além da InvokeRequired propriedade , há quatro métodos em um controle que são thread-safe para chamar: InvokeeBeginInvokeEndInvokeCreateGraphics se o identificador para o controle já foi criado. Chamar CreateGraphics antes que o identificador do controle seja criado em um thread em segundo plano pode causar chamadas cruzadas ilegais. Para todas as outras chamadas de método, você deve usar um desses métodos de invocação ao chamar de um thread diferente.

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

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

Você pode proteger contra esse caso verificando também o valor de IsHandleCreated quando InvokeRequired retorna false em um thread em segundo plano. Se o identificador de controle ainda não tiver sido criado, você deverá aguardar até que ele tenha sido criado antes de chamar Invoke ou BeginInvoke. Normalmente, isso ocorre somente se um thread em segundo plano for criado no construtor do formulário primário para o aplicativo (como em Application.Run(new MainForm()), antes que o formulário tenha sido mostrado ou Application.Run tenha sido chamado.

Uma solução é aguardar até que o identificador do formulário seja criado antes de iniciar o thread em segundo plano. Force a criação do identificador chamando a Handle propriedade ou aguarde até que o Load evento inicie o processo em segundo plano.

Uma solução ainda melhor é usar o SynchronizationContext retornado por SynchronizationContext em vez de um controle para marshaling entre threads.

Observação

Uma exceção poderá ser gerada se o thread que deve processar a mensagem não estiver mais ativo.

Para obter mais informações sobre controles de Windows Forms multithreaded, consulte Como usar um thread em segundo plano para pesquisar arquivos e Como fazer chamadas Thread-Safe para controles de Windows Forms.

Aplica-se a

Confira também