Фоновое обновление рабочего процесса останавливает просмотр данных
Я пытаюсь написать приложение, чтобы получить список пользователей в различных группах AD и отобразить их в таблице данных на форме. При нажатии кнопки в моей форме запускается фоновый рабочий, который вызывает метод для получения списка пользователей для группы AD. Фоновый рабочий возвращает таблицу данных, а метод завершенного фонового рабочего устанавливает источник данных таблицы данных в таблицу данных, и все работает нормально. Проблема возникает, когда я пытаюсь использовать метод изменения прогресса фонового рабочего для обновления сетки данных при заполнении каждого столбца таблицы данных. Он работает нормально, когда фоновый рабочий работает, но когда он завершает сетку, и форма перестает отвечать на запросы нескольких минут. Я изо всех сил пытаюсь выяснить, почему это так.
пример кода:
backroundWorker_DoWork(.........)
{
DataTable dt = new DataTable();
DataRow dr;
//Get datatable from argument
DataTable dt2 = e.Argument as DataTable
//get list of AD groups to check
for (int i = 0; i > dt2.Rows.Count; i++)
{
columnName = dt2.Rows[i][0].ToString();
groupName = dt2.Rows[i][1].ToString();
//Call Method to get users from nested AD groups
GetADUsers(groupName)
//Add users returned from above method to DataTable dt
//..........
//Send DataTable to Report Progress
backgroundWorker.ReportProgress(0, dt);
}
e.Result = dt;
}
backroundWorker_ProgressChanged(..........)
{
DataTable dt = e.UserState as DataTable;
dataGridView1.DataSource = dt;
}
backroundWorker_RunWorkerCompleted(..........)
{
DataTable dt = e.UserState as DataTable;
dataGridView1.DataSource = dt;
}
1 ответ
В обработчике событий RunWorkerCompled() вы должны использовать e.Result вместо e.UserState, т.е. ваш код должен выглядеть так:
DataTable dt = e.Result as DataTable,
В качестве практики перед чтением результата в событии RunWorkerCompleted следует также проверить наличие ошибок с использованием синтаксиса e.Error!= Null, см. Полный пример ComputeFibonacci с использованием компонента фонового рабочего в приведенной ниже ссылке MSDN:
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx