后台工作者更新进度冻结了datagridview

时间:2011-09-29 08:07:56

标签: windows winforms backgroundworker

我正在尝试编写一个应用程序来获取各个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 个答案:

答案 0 :(得分:0)

在RunWorkerCompled()事件处理程序中,您应该使用e.Result而不是e.UserState,即您的代码应该是:

DataTable dt = e.Result as DataTable,

作为在RunWorkerCompleted事件中读取结果之前的做法,您还应该使用e.Error!= null语法检查错误,请参阅以下MSDN链接中使用后台工作组件的完整ComputeFibonacci示例:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx