Control.InvokeRequired Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Recebe um valor que indica se o chamador deve chamar um método invoke ao fazer chamadas ao método de controlo porque o chamador está numa thread diferente daquela em que o controlo 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 de Propriedade
true se o do controlo Handle foi criado numa thread diferente da thread que chama (indicando que deve fazer chamadas ao controlo através de um método invoke); caso contrário, false.
Implementações
- Atributos
Observações
Os controlos no Windows Forms estão ligados a um thread específico e não são seguros para threads. Portanto, se estiver a chamar o método de um controlo a partir de um thread diferente, deve usar um dos métodos de invocação do controlo para fazer o marshal da chamada para o thread correto. Esta propriedade pode ser usada para determinar se deve chamar um método de invocação, o que pode ser útil se não souber qual thread detém um controlo.
Note
Além da InvokeRequired propriedade, existem quatro métodos num controlo que são seguros para chamar em thread: Invoke,BeginInvoke, EndInvoke e CreateGraphics se o handle do controlo já tiver sido criado. Chamar CreateGraphics antes de o handle do controlo ter sido criado numa thread em segundo plano pode causar chamadas ilegais de cross thread. Para todas as outras chamadas de métodos, deve usar um destes métodos de invocação ao chamar a partir de um thread diferente.
Se a alça do controlo ainda não existir, InvokeRequired procura a cadeia mãe do controlo até encontrar um controlo ou formulário que tenha uma manivela de janela. Se não for encontrado um handle apropriado, o InvokeRequired método devolve false.
Isto significa que InvokeRequired pode regressar false se Invoke não for necessário (a chamada ocorre no mesmo thread), ou se o controlo foi criado num thread diferente mas o handle do controlo ainda não foi criado.
No caso de o handle do controlo ainda não ter sido criado, não deve simplesmente chamar propriedades, métodos ou eventos no controlo. Isto pode fazer com que o handle do controlo seja criado na thread em segundo plano, isolando o controlo numa thread sem uma mensagem pump e tornando a aplicação instável.
Pode proteger-se contra este caso verificando também o valor de IsHandleCreated quando InvokeRequired retorna false num thread em segundo plano. Se a alavanca de controlo ainda não foi criada, deve esperar até que seja criada antes de chamar Invoke ou BeginInvoke. Normalmente, isto acontece apenas se um thread de fundo for criado no construtor da forma primária da aplicação (como em Application.Run(new MainForm()), antes da forma ter sido mostrada ou Application.Run ter sido chamada).
Uma solução é esperar que o handle do formulário seja criado antes de iniciar o thread em segundo plano. Ou forças a criação de handle chamando a Handle propriedade, ou esperas até ao Load evento para iniciar o processo em segundo plano.
Uma solução ainda melhor é usar o SynchronizationContext return by SynchronizationContext em vez de um controlo para marshaling cross-thread.
Note
Pode ser lançada uma exceção se o thread que deveria processar a mensagem deixar de estar ativo.
Para mais informações sobre controlos de Windows Forms multithreaded, veja Como: Usar um Thread em Segundo Plano para Procurar Ficheiros e Como: Fazer chamadas Thread-Safe para controlos Windows Forms.