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