Поделиться через


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

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

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

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

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

Чтобы разрешить элементу управления PictureBox асинхронно загружать изображение

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

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

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

    Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
    
    public Form1()
    {
        InitializeComponent();
    
        this.pictureBox1.LoadCompleted += 
            new System.ComponentModel.AsyncCompletedEventHandler(this.pictureBox1_LoadCompleted);
    }
    
    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
    
    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");
        }
    }
    
  3. Добавьте в форму две кнопки loadButton и cancelLoadButton. Добавьте обработчики события Click для запуска и отмены загрузки.

    Private Sub loadButton_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles loadButton.Click
    
        ' Replace with a real url.
        PictureBox1.LoadAsync("http://www.tailspintoys.com/image.jpg")
    
    End Sub
    
    private void loadButton_Click(object sender, EventArgs e)
    {
        // Replace with a real url.
        pictureBox1.LoadAsync("http://www.tailspintoys.com/image.jpg");
    }
    
    Private Sub cancelLoadButton_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cancelLoadButton.Click
    
        PictureBox1.CancelAsync()
    
    End Sub
    
    private void cancelLoadButton_Click(object sender, EventArgs e)
    {
        pictureBox1.CancelAsync();
    }
    
  4. Запустите приложение.

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

См. также

Задачи

Практическое руководство. Фоновое выполнение операции

Основные понятия

Обзор асинхронной модели, основанной на событиях

Другие ресурсы

Multithreading in Visual Basic