2011-09-29 78 views
0

我正试图编写一个应用程序来获取列表中的各个AD组中的用户并将它们显示在窗体上的数据网格中。 点击表单上的按钮后,会触发后台工作人员调用方法来获取AD组的用户列表。 后台工作人员返回一个数据表,后台工作人员完成方法将数据网格数据源设置为数据表,一切正常。 当我尝试使用后台工作进程更改方法来更新数据网格时,会出现问题,因为每个数据表列都被填充。它在后台工作正在运行时工作正常,但是当它完成网格并且表单变得无响应时几分钟。 我正在努力弄清楚为什么这是。后台工作人员更新进度冻结datagridview

代码示例:

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; 
} 

回答

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