Привет друзья! Сегодня мы обсудим в этой статье, как использовать элемент управления Backgroundwalker в C# и загружать записи из таблицы базы данных.

Введение

BackgroundWorker используется для выполнения интенсивных задач (отнимающих много времени) в отдельном потоке, поэтому пользовательский интерфейс (UI) не зависает.
Поскольку задачи выполняются в фоновом режиме и могут занять много времени, необходимо отображать некоторые настраиваемые сообщения и обновлять пользовательский интерфейс по завершении работы.

Добавление элемента управления BackgroundWorker

Чтобы добавить элемент управления BackgroundWorker в форму, просто перетащите элемент управления из панели инструментов на форму или дважды щелкните элемент управления в панели инструментов, чтобы добавить его в форму.
Затем элемент управления помещается на системный трей

Элемент управления BackgroundWorker выделен кружком, расположенным на панели задач.

Свойства BackgroundWorker

Свойства BackgroundWorker, которые вам необходимо знать:

WorkerReportsProgress — используется для индикации хода выполнения при выполнении задачи.

WorkerSupportsCancellation — указывает, можно ли отменить фоновую задачу.

IsBusy — указывает, что фоновый рабочий выполняет асинхронную операцию/фоновую задачу или нет.

CancellationPending — указывает, что приложение запросило отмену фоновой задачи.

Методы BackgroundWorker

Методы, связанные с BackgroundWorker:

RunWorkerAsync — для запуска фоновой задачи.

CancelAsync — для остановки фоновой задачи/потока.

ReportProgress — чтобы сообщить о прогрессе

События BackgroundWorker

Это три события, связанные с BackgroundWorker.

Событие DoWork выполняет дорогостоящую работу по выполнению фонового потока.

Событие DoWork вызывается при вызове метода RunWorkerAsync.

Где DoWorkEventArgs имеет свойства e.Argument и e.Result

e. Аргумент — ссылка параметра на BackgroundWorker, полученная RunWorkerAsync.

e. Результат — указывает, выполнил ли BackgroundWorker обработку.

Прогресс изменен

Событие ProgressChanged сообщает о ходе работы потока. Событие ProgressChanged вызывается из события DoWork с помощью метода ReportProgress().

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{
// To report BackgroundWorker Progress
}

Затем ProgressChangedEventArgs содержит свойства e.ProgressPercentage и e.UserState.

e.ProgressPercentage — получает процент выполнения фоновой задачи, который отправляется в качестве параметра в методе ReportProgress() события DoWork.

e.UserState —получает состояние пользователя, которое отправляется как часть метода ReportProgress() из события DoWork.

RunWorkerCompleted

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

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{
//Executed Up on Completion of BackgroundTask/ Failure/ Cancellation of Operation
}

RunWorkerCompletedEventArgs имеет

e. Cancelled — указывает, что операция BackgroundWorker была отменена.

e. Ошибка — Произошла ошибка при выполнении фонового процесса.

e. результат — указывает результат выполнения фонового процесса.

Пример программы BackgroundWorker Запуск задачи BackgroundWorker

BackgroundWorker DoWork запускается при вызове метода RunWorkerAsync.

Здесь событие btStart_Click вызывает метод RunWorkerAsync() для запуска события DoWork объекта BackgroundWorker, который выполняет трудоемкую задачу в фоновом потоке.

Здесь передайте RunWorkerAsync() объект класса RetriveTableData.

/// <summary> 
 /// Trial Class for Example
 /// </summary>
 public class RetriveTableData
 {
 public string EmpId;
 public string EmpName;
 }

В приведенном выше коде мы проверяем, выполняет ли BackgroundWorker какую-либо задачу в фоновом режиме, используя файл backgroundWorker1. занят Недвижимость. Если нет, мы вызываем метод RunWorkerAsync, чтобы начать выполнение потока.

Тема BackgroundWorker

Фактическое выполнение потока начинается здесь

e.Argument в RetriveTableData Obj = (RetriveTableData)e.Argument содержит ссылку Parameter на BackgroundWorker, полученную RunWorkerAsync, которую мы явно приводим к типу RetriveTableData.

Затем мы устанавливаем соединение с указанным источником данных и читаем записи из базы данных с помощью класса SqlDataReader. Reader.Read() читает/извлекает строки одну за другой из таблицы базы данных.

Затем мы сообщаем о ходе выполнения, используя метод ReportProgress объекта BackgroundWorker, где мы передаем ему переменную типа int I и RetriveTableData Obj, которая имеет номер записи, а Obj содержит значение недавно прочитанной записи.

Каждый раз мы увеличиваем переменную I до 1, чтобы указать количество читаемых записей.

// Чтобы сообщить о прогрессе.

backgroundWorker1.ReportProgress(i,Obj);

BackgroundWorker Progress

Событие ProgressChanged BackgroundWorker запускается, когда; ReportProgress вызывается из события DoWork.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
 {
 if (!backgroundWorker1.CancellationPending)
 {
 //Gets the user state that is sent as part of ReportProgress() Method from DoWork Event
 RetriveTableData Obj = (RetriveTableData)e.UserState;
 //Add the data to the dataGridView1
 dataGridView1.Rows.Add(Obj.EmpId.ToString(),Obj.EmpName.ToString());
 toolStripProgressBar1.Value = e.ProgressPercentage;
 toolStripStatusLabel1.Text = "Processing row.. " + e.ProgressPercentage.ToString() + " of " +TotalRecords;
 }
 }

Здесь мы получаем UserState и добавляем данные в dataGridView1, а также устанавливаем значение toolStripProgressBar1 на процент выполнения фоновой задачи, который отправляется в качестве параметра в методе ReportProgress() в событии DoWork.

Завершение фоновой задачи

При завершении, отмене или сбое задачи возникает следующее событие.

Если Задача BackgroundWorker отменена Приложением, то e. Для Canceled установлено значение true, и блок кода в нем выполняется. Отмена задачи отправляется из события DoWork в событие RunWorkerCompleted. В Событии DoWork фрагмент кода для проверки того, что Процесс был отменен,

if (backgroundWorker1.CancellationPending) 
 {
 // Set the e.Cancel flag so that the WorkerCompleted event
 // knows that the process was cancelled.
 e.Cancel = true;
 backgroundWorker1.ReportProgress(0);
 return;
 }

Отмена фоновой задачи

Фоновый процесс отменяется методом CancelAsync объекта BackgroundWorker.

//To see that background Process is running a Process 
 if (backgroundWorker1.IsBusy)
 {
 // Stop the Background Thread execution
 backgroundWorker1.CancelAsync();
 btCancel.Enabled = false;
 btStart.Enabled = true;
 }

Здесь мы проверяем, что BackgroundWorker выполняет поток, и прерываем его.

выполнение потока путем вызова метода CancelAsync.

Вывод

Мы увидели, как работать с элементом управления BackgroundWorker в C# Windows Form, который выполняет асинхронную операцию в отдельном потоке, а также со свойствами и событиями, связанными с BackgroundWorker.

Первоначально опубликовано на https://www.mindstick.com 13 марта 2017 года.