Пошаговое руководство. Фоновое выполнение операции
Если какая-либо операция будет выполняться в течение долгого времени и при этом требуется не допустить задержек в работе пользовательского интерфейса, можно использовать класс BackgroundWorker для выполнения операции в другом потоке.
Полный код, используемый в этом примере, см. в разделе как: Фоновое выполнение операции.
Note
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки Visual Studio.
Для запуска операции в фоновом режиме
Форма будет открыта в конструкторе Windows Forms, перетащите два Button управляет из элементов форму, а затем задайте
Name
и Text свойства кнопок согласно следующей таблице.Кнопка name Текста button1
startBtn
Запуск button2
cancelBtn
Отмена Откройте элементов, нажмите кнопку компоненты вкладке, а затем перетащите BackgroundWorker в форму компонент.
backgroundWorker1
Компонент появится в область компонентов.В окне Свойства присвойте свойству WorkerSupportsCancellation значение
true
.В свойства щелкните события кнопку, а затем дважды щелкните DoWork и RunWorkerCompleted событий, чтобы создать обработчики событий.
Вставьте код требует много времени в DoWork обработчик событий.
Извлечение всех параметров, необходимые для операции из Argument свойство DoWorkEventArgs параметр.
Присвоить результат вычисления Result свойство DoWorkEventArgs.
Это будет предоставляться RunWorkerCompleted обработчик событий.
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; } }
Вставьте код для получения результата операции в RunWorkerCompleted обработчик событий.
// 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 обработчик событий.Вызовите RunWorkerAsync метод в Click обработчик событий для
startButton
.private void startBtn_Click(object sender, EventArgs e) { this.backgroundWorker1.RunWorkerAsync(2000); }
В конструкторе Windows Forms дважды щелкните
cancelButton
для создания Click обработчик событий.Вызовите CancelAsync метод в 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
метод перехватывается и отображается отладчиком. При запуске приложения вне отладчика, BackgroundWorker обрабатывает исключение и кэширует его в Error свойство RunWorkerCompletedEventArgs.
Нажмите кнопку запустить для запуска асинхронной операции, а затем нажмите кнопку отменить кнопка для остановки асинхронной операции.
Результат каждой операции выводится в элементе MessageBox.
Следующие шаги
Реализация формы, в которой отображается ход выполнения асинхронной операции. Дополнительные сведения см. в разделе Как Реализация формы, в который выполняется фоновая операция.
Реализуйте класс, поддерживающий асинхронную модель для компонентов. Дополнительные сведения см. в разделе реализации асинхронной модели на основе событий.