Фоновое обновление рабочего процесса останавливает просмотр данных

Я пытаюсь написать приложение, чтобы получить список пользователей в различных группах 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

Другие вопросы по тегам