Partilhar via


Como: Manipular controles de Threads

O BackgroundWorker componente substitui e adiciona funcionalidade para o BeginInvoke método; No entanto, o BeginInvoke método é mantido para compatibilidade com versões anteriores e o uso futuro, se você escolher. Para obter mais informações, consulte Visão geral sobre o componente BackgroundWorker.

Multithreading é ideal para executar os procedimentos de uso intenso do processador de módulos de classe. Ao contrário de outros componentes, existem problemas ao chamar diretamente os métodos nos controles de segmentos separados. Métodos que afetam controles devem ser executados somente no segmento em que o controle foi criado. Como o empacotamento de chamadas de um thread e enviá-los nos limites do segmento para outro são muito caro em termos de recursos do sistema, você deve evitar chamadas repetidamente a controles em outros segmentos. Na melhor das hipóteses, chamadas diretas de outros threads são caras e o desempenho do seu aplicativo será afetada. Na pior das hipóteses, poderiam ocorrer condições que causam um deadlock no seu aplicativo, congelar a execução.

No entanto, pode haver ocasiões quando desejar chamar métodos de controles a partir de seus segmentos. Por exemplo, você pode chamar um método que desativa a um botão ou atualiza uma exibição em um formulário em resposta a ação realizada por um thread. A.NET Framework fornece métodos que são seguros chamar a partir de qualquer segmento para chamar os métodos que interagem com os controles pertencentes a outros segmentos. O Invoke método permite a execução síncrona de métodos nos controles, enquanto o BeginInvoke método inicia execução assíncrona. Para usar esses métodos, você deve declarar um delegado com a mesma assinatura que o método que você invocando. Em seguida, você pode chamar o Invoke ou BeginInvoke o método de qualquer controle no formulário, fornecendo o delegado apropriado para o método que você deseja que a chamada. Todos os parâmetros obrigatórios são encapsulados em um Object e transmitida para o método.

Para chamar métodos que envolvem controles pertencentes a outros threads

  1. Declare um delegado com uma assinatura idêntico ao método que deseja invocar.

    O exemplo a seguir mostra como declarar um delegado com Integer e String parâmetros.

    Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
       aString as String)
    
    public delegate void myDelegate(int anInteger, string aString);
    
  2. Use qualquer controle para chamar os métodos que manipulam os controles pertencentes a outros segmentos.

    ObservaçãoObservação

    Parâmetros (se houver) necessários para o método podem ser fornecidos dentro de um Object.

    • Se você deseja chamar métodos de forma síncrona, chame o O método de Invoke.

      Label1.Invoke(New myDelegate(AddressOf myMethod), New _
         Object() {1, "This is the string"})
      
      Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
         "This is the string"});
      
    • Se você deseja invocar métodos assincronamente, chame o BeginInvoke método.

      Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
         New Object() {1, "This is the string"})
      
      Label1.BeginInvoke(new myDelegate(myMethod), new 
      Object[] {1, "This is the string"});
      

Consulte também

Tarefas

Demonstra Passo a passo: Criação de um componente Multithreaded simples com Visual Basic

Demonstra Passo a passo: Criação de um componente Multithreaded simples com Visual C#

Referência

BackgroundWorker

Conceitos

Event-based Asynchronous Pattern Overview

Outros recursos

Multithreading em componentes