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

Boolean

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 estã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 fazer marshal da chamada para o thread adequado. Essa propriedade pode ser usada para determinar se você deve chamar um método de invocação, 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: Invoke,BeginInvokee EndInvoke CreateGraphics se o identificador para o controle já foi criado. Chamar CreateGraphics antes que o identificador do controle tenha sido 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 pesquise 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 isso 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 nesse caso também verificando 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 acontece somente se um thread em segundo plano for criado no construtor do formulário primário do 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 tenha sido 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 em SynchronizationContext 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 multithreaded Windows Forms, 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