Procedura: usare componenti che supportano il modello asincrono basato su eventi

Molti componenti consentono di eseguire le attività in modo asincrono. I componenti SoundPlayer e PictureBox, ad esempio, consentono di caricare suoni e immagini "in background", mentre l'esecuzione del thread principale procede senza interruzioni.

L'uso di metodi asincroni in una classe che supporta il modello asincrono basato su eventi può essere semplice quanto collegare un gestore eventi all'evento MethodNameCompleted del componente, come per qualsiasi altro evento. Quando si chiama il metodo MethodNameAsync, l'esecuzione dell'applicazione continua senza interruzioni fino alla generazione dell'evento MethodNameCompleted. Nel gestore eventi è possibile esaminare il parametro AsyncCompletedEventArgs per determinare se l'operazione asincrona è stata completata o se è stata annullata.

Per altre informazioni sull'uso dei gestori eventi, vedere Cenni preliminari sui gestori eventi.

La procedura seguente mostra come usare la funzionalità asincrona di caricamento di immagini di un controllo PictureBox.

Per abilitare un controllo PictureBox per caricare in modo asincrono un'immagine

  1. Creare un'istanza del componente PictureBox nel modulo.

  2. Assegnare un gestore per l'evento LoadCompleted.

    Controllare gli eventuali errori che si sono verificati durante il download asincrono. Controllare anche l'eventuale annullamento.

    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. Aggiungere due pulsanti, denominati loadButton e cancelLoadButton, nel modulo. Aggiungere gestori dell'evento Click per avviare e annullare il 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. Eseguire l'applicazione.

    Man mano che il download dell'immagine procede, è possibile spostare liberamente il modulo, ridurlo e ingrandirlo.

Vedi anche