Практическое руководство. Использование компонентов, поддерживающих асинхронную модель, основанную на событиях

Многие компоненты предоставляют возможность выполнять работу асинхронно. Например, компоненты SoundPlayer и PictureBox позволяют загружать звуки и изображения в фоновом режиме, не прерывая работу основного потока.

Чтобы применить асинхронные методы для класса, поддерживающего асинхронную модель на основе событий, зачастую достаточно присоединить обработчик события к событию имя_методаCompleted нужного компонента, как для любого другого события. При вызове метода имя_методаAsync приложение будет работать без прерывания, пока не будет создано событие имя_методаCompleted. В обработчике событий вы можете проверить параметр AsyncCompletedEventArgs, чтобы определить, была ли асинхронная операция выполнена успешно или отменена.

Дополнительные сведения об обработчиках событий см. в статье Обзор обработчиков событий (Windows Forms).

Следующая процедура демонстрирует, как использовать возможность асинхронной загрузки изображений в элементе управления PictureBox.

Асинхронная загрузка изображений для элемента управления PictureBox

  1. Создайте в форме экземпляр компонента PictureBox.

  2. Назначьте обработчик событий для события LoadCompleted.

    Проверьте в нем наличие ошибок, которые могли произойти во время асинхронной загрузки. Также здесь нужно проверить, не запрошена ли отмена.

    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. Добавьте в форму две кнопки с именами loadButton и cancelLoadButton. Добавьте обработчики событий Click для запуска и отмены загрузки.

    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. Запустите приложение.

    В процессе загрузки изображения вы сможете свободно перемещаться по форме, сворачивать ее и разворачивать.

См. также