Como: Usar componentes que suportam o padrão assíncrono baseado em evento
Muitos componentes oferecem a opção de executar seu trabalho de forma assíncrona. Os SoundPlayer componentes e PictureBox , por exemplo, permitem que você carregue sons e imagens "em segundo plano" enquanto o thread principal continua em execução sem interrupção.
Usar métodos assíncronos em uma classe que ofereça 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 faria para qualquer outro evento. Quando você chama o método MethodNameAsync , seu aplicativo continuará em execução sem interrupção até que o evento MethodNameCompleted seja gerado. No manipulador de eventos, você pode examinar o AsyncCompletedEventArgs parâmetro para determinar se a operação assíncrona foi concluída com êxito ou se foi cancelada.
Para obter mais informações sobre como usar manipuladores de eventos, consulte Visão geral de manipuladores de eventos.
O procedimento a seguir mostra como usar o recurso de carregamento assíncrono de imagem de um PictureBox controle.
Para habilitar um controle PictureBox para carregar uma imagem de forma assíncrona
Crie uma instância do PictureBox componente em seu formulário.
Atribua um manipulador de eventos ao LoadCompleted evento.
Verifique se há erros que possam ter ocorrido durante o download assíncrono aqui. É também aqui que verifica 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
Adicione dois botões, chamados
loadButton
ecancelLoadButton
, ao seu 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
Execute seu aplicativo.
À medida que o download da imagem prossegue, você pode mover o formulário livremente, minimizá-lo e maximizá-lo.