Практическое руководство. Использование компонентов, поддерживающих асинхронную модель, основанную на событиях
Многие компоненты предоставляют возможность выполнять работу асинхронно. Например, компоненты SoundPlayer и PictureBox позволяют загружать звуки и изображения в фоновом режиме, не прерывая работу основного потока.
Чтобы применить асинхронные методы для класса, поддерживающего асинхронную модель на основе событий, зачастую достаточно присоединить обработчик события к событию имя_методаCompleted нужного компонента, как для любого другого события. При вызове метода имя_методаAsync приложение будет работать без прерывания, пока не будет создано событие имя_методаCompleted. В обработчике событий вы можете проверить параметр AsyncCompletedEventArgs, чтобы определить, была ли асинхронная операция выполнена успешно или отменена.
Дополнительные сведения об обработчиках событий см. в статье Обзор обработчиков событий (Windows Forms).
Следующая процедура демонстрирует, как использовать возможность асинхронной загрузки изображений в элементе управления PictureBox.
Асинхронная загрузка изображений для элемента управления PictureBox
Создайте в форме экземпляр компонента PictureBox.
Назначьте обработчик событий для события 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
Добавьте в форму две кнопки с именами
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
Запустите приложение.
В процессе загрузки изображения вы сможете свободно перемещаться по форме, сворачивать ее и разворачивать.