Procedimiento para usar componentes que admitan el modelo asincrónico basado en eventos
Muchos componentes le ofrecen la opción de realizar su trabajo de forma asincrónica. Por ejemplo, los componentes SoundPlayer y PictureBox permiten cargas sonidos e imágenes "en segundo plano" mientras el subproceso principal continúa ejecutándose sin interrupción.
Usar métodos asincrónicos en una clase que admite la Información general sobre el modelo asincrónico basado en eventos puede ser tan sencillo como adjuntar un controlador de eventos al evento MethodNameCompleted del componente, como lo haría para cualquier otro evento. Cuando se llama al método MethodNameAsync, la aplicación continuará ejecutándose sin interrupción hasta que se genere el evento MethodNameCompleted. En el controlador de eventos, puede examinar el parámetro AsyncCompletedEventArgs para determinar si la operación asincrónica se completó correctamente o si se canceló.
Para más información sobre el uso de los controladores de eventos, vea Información general sobre controladores de eventos.
En el siguiente procedimiento se explica cómo usar la funcionalidad de carga de imágenes asincrónica de un control PictureBox.
Para permitir que un control PictureBox cargue una imagen de manera asincrónica
Cree una instancia del componente PictureBox en el formulario.
Asigne un controlador de eventos al evento LoadCompleted.
Compruebe si hay errores que puedan haberse producido durante la descarga asincrónica aquí. También es donde puede comprobar posibles cancelaciones.
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
Agregue dos botones, denominados
loadButton
ycancelLoadButton
, al formulario. Agregue los controladores de eventos Click para iniciar y cancelar la descarga.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
Ejecute la aplicación.
Mientras se realiza la descarga de la imagen, puede mover libremente el formulario, minimizarlo y maximizarlo.
Consulte también
- Cómo: Ejecutar una operación en segundo plano
- Event-based Asynchronous Pattern Overview (Información general sobre el modelo asincrónico basado en eventos)