Como: Usar componentes compatíveis com o padrão assíncrono baseado em evento

Muitos componentes oferecem a opção de executar seu trabalho de forma assíncrona. Os componentes SoundPlayer e PictureBox, por exemplo, permite que você carregue sons e imagens "em segundo plano", enquanto o thread principal continua em execução sem interrupções.

Usar métodos assíncronos em uma classe que dá suporte à Visão geral do padrão assíncrono baseado em evento pode ser tão simples quanto anexar um manipulador de eventos ao evento MethodNameCompleted do componente, assim como você faria com qualquer outro evento. Quando você chama o método MethodNameAsync, seu aplicativo continuará sendo executado sem interrupção até que o evento MethodNameCompleted seja gerado. No manipulador de eventos, você pode examinar o parâmetro AsyncCompletedEventArgs para determinar se a operação assíncrona foi concluída com êxito ou se foi cancelada.

Para saber mais sobre como usar manipuladores de evento, consulte Visão geral dos manipuladores de evento.

O procedimento a seguir mostra como usar o recurso de carregamento de imagem assíncrono de um controle PictureBox.

Para ativar um controle PictureBox para carregar assincronamente uma imagem

  1. Crie uma instância do componente PictureBox no formulário.

  2. Atribua um manipulador de eventos ao evento LoadCompleted.

    Verifique se ocorreu algum erro durante o download assíncrono aqui. Verifique também o cancelamento.

    public Form1()
    {
        InitializeComponent();
    
        this.pictureBox1.LoadCompleted +=
            new System.ComponentModel.AsyncCompletedEventHandler(this.pictureBox1_LoadCompleted);
    }
    
    Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
    
    private void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message, "Load Error");
        }
        else if (e.Cancelled)
        {
            MessageBox.Show("Load canceled", "Canceled");
        }
        else
        {
            MessageBox.Show("Load completed", "Completed");
        }
    }
    
    Private Sub PictureBox1_LoadCompleted( _
        ByVal sender As System.Object, _
        ByVal e As System.ComponentModel.AsyncCompletedEventArgs) _
        Handles PictureBox1.LoadCompleted
    
        If (e.Error IsNot Nothing) Then
            MessageBox.Show(e.Error.Message, "Load Error")
        ElseIf e.Cancelled Then
            MessageBox.Show("Load cancelled", "Canceled")
        Else
            MessageBox.Show("Load completed", "Completed")
        End If
    
    End Sub
    
  3. Adicione dois botões, chamados loadButton e cancelLoadButton, ao formulário. Adicione Click manipuladores de eventos para iniciar e cancelar o download.

    private void loadButton_Click(object sender, EventArgs e)
    {
        // Replace with a real url.
        pictureBox1.LoadAsync("https://unsplash.com/photos/qhixfmpqN8s/download?force=true&w=1920");
    }
    
    Private Sub loadButton_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles loadButton.Click
    
        ' Replace with a real url.
        PictureBox1.LoadAsync("https://unsplash.com/photos/qhixfmpqN8s/download?force=true&w=1920")
    
    End Sub
    
    private void cancelLoadButton_Click(object sender, EventArgs e)
    {
        pictureBox1.CancelAsync();
    }
    
    Private Sub cancelLoadButton_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cancelLoadButton.Click
    
        PictureBox1.CancelAsync()
    
    End Sub
    
  4. Execute seu aplicativo.

    Conforme o download da imagem prossegue, você pode mover o formulário livremente, minimizá-lo e maximizá-lo.

Confira também