【问题标题】:Background worker update progress freezes datagridview后台工作人员更新进度冻结 datagridview
【发布时间】:2011-10-21 00:51:20
【问题描述】:

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

【问题讨论】:

    标签: windows winforms backgroundworker


    【解决方案1】:

    在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2014-08-14
      相关资源
      最近更新 更多