Пошаговое руководство. Фоновое выполнение операции
Если какая-либо операция будет выполняться в течение долгого времени и при этом требуется не допустить задержек в работе пользовательского интерфейса, можно использовать класс Background
Полный код, используемый в этом примере, см. в разделе как: Фоновое выполнение операции.
Note
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки Visual Studio.
Для запуска операции в фоновом режиме
Форма будет открыта в конструкторе Windows Forms, перетащите два Button управляет из элементов форму, а затем задайте
Name
и Text свойства кнопок согласно следующей таблице.Кнопка name Текста button1
startBtn
Запуск button2
cancelBtn
Отмена Откройте элементов, нажмите кнопку компоненты вкладке, а затем перетащите Background
Worker в форму компонент.backgroundWorker1
Компонент появится в область компонентов.В окне Свойства присвойте свойству Worker
Supports значениеCancellation true
.В свойства щелкните события кнопку, а затем дважды щелкните Do
Work и RunWorker событий, чтобы создать обработчики событий.Completed Вставьте код требует много времени в Do
Work обработчик событий.Извлечение всех параметров, необходимые для операции из Argument свойство Do
Work параметр.Event Args Присвоить результат вычисления Result свойство Do
Work .Event Args Это будет предоставляться Run
Worker обработчик событий.Completed private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Do not access the form's BackgroundWorker reference directly. // Instead, use the reference provided by the sender parameter. BackgroundWorker bw = sender as BackgroundWorker; // Extract the argument. int arg = (int)e.Argument; // Start the time-consuming operation. e.Result = TimeConsumingOperation(bw, arg); // If the operation was canceled by the user, // set the DoWorkEventArgs.Cancel property to true. if (bw.CancellationPending) { e.Cancel = true; } }
Вставьте код для получения результата операции в Run
Worker обработчик событий.Completed // This event handler demonstrates how to interpret // the outcome of the asynchronous operation implemented // in the DoWork event handler. private void backgroundWorker1_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { // The user canceled the operation. MessageBox.Show("Operation was canceled"); } else if (e.Error != null) { // There was an error during the operation. string msg = String.Format("An error occurred: {0}", e.Error.Message); MessageBox.Show(msg); } else { // The operation completed normally. string msg = String.Format("Result = {0}", e.Result); MessageBox.Show(msg); } }
Выполните метод
TimeConsumingOperation
.// This method models an operation that may take a long time // to run. It can be cancelled, it can raise an exception, // or it can exit normally and return a result. These outcomes // are chosen randomly. private int TimeConsumingOperation( BackgroundWorker bw, int sleepPeriod ) { int result = 0; Random rand = new Random(); while (!bw.CancellationPending) { bool exit = false; switch (rand.Next(3)) { // Raise an exception. case 0: { throw new Exception("An error condition occurred."); break; } // Sleep for the number of milliseconds // specified by the sleepPeriod parameter. case 1: { Thread.Sleep(sleepPeriod); break; } // Exit and return normally. case 2: { result = 23; exit = true; break; } default: { break; } } if( exit ) { break; } } return result; }
В конструкторе Windows Forms дважды щелкните
startButton
для создания Click обработчик событий.Вызовите Run
Worker метод в Click обработчик событий дляAsync startButton
.private void startBtn_Click(object sender, EventArgs e) { this.backgroundWorker1.RunWorkerAsync(2000); }
В конструкторе Windows Forms дважды щелкните
cancelButton
для создания Click обработчик событий.Вызовите Cancel
Async метод в Click обработчик событий дляcancelButton
.private void cancelBtn_Click(object sender, EventArgs e) { this.backgroundWorker1.CancelAsync(); }
В верхней части файла импортируйте пространства имен System.ComponentModel и System.Threading.
using System; using System.ComponentModel; using System.Drawing; using System.Threading; using System.Windows.Forms;
Нажмите клавишу F6 для построения решения и нажмите клавишу CTRL + F5, чтобы запустить приложение вне отладчика.
Note
Если нажать клавишу F5 для запуска приложения в отладчике, то исключение, возникающее в TimeConsumingOperation
метод перехватывается и отображается отладчиком. При запуске приложения вне отладчика, Background
Нажмите кнопку запустить для запуска асинхронной операции, а затем нажмите кнопку отменить кнопка для остановки асинхронной операции.
Результат каждой операции выводится в элементе Message
Box .
Следующие шаги
Реализация формы, в которой отображается ход выполнения асинхронной операции. Дополнительные сведения см. в разделе Как Реализация формы, в который выполняется фоновая операция.
Реализуйте класс, поддерживающий асинхронную модель для компонентов. Дополнительные сведения см. в разделе реализации асинхронной модели на основе событий.