2011-09-29 79 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