2013-09-23 71 views
0

我創建了一個backgroundworker來填充datagirdview。 DatagridView使用從表中獲取2000條記錄的列表填充。我使用後臺工作來刪除無響應的用戶界面。BackgroundWroker跨線程操作無效

private BackgroundWorker worker; 
worker = new BackgroundWorker() { WorkerReportsProgress = true }; 
worker.DoWork += worker_DoWork; 
worker.RunWorkerAsync(); 

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var listAccGroups = vwAccVoucherDetails.ToList(); // vwAccVoucherDetails is the table containing records. 
    dgvBalanceSheet.DataSource = listAccGroups; 
} 

我得到的錯誤是:

跨線程操作無效:控制「dgvBalanceSheet」從比它創建的線程以外的線程訪問 。

如何設置datagridView的數據源而不會出現這些類型的錯誤?

+0

@Soner Gonul:Thanxxx編輯我的問題。 –

回答

3

您需要使用Completed事件的BackgroundWorker的:

BackgroundWorker worker = new BackgroundWorker() { WorkerReportsProgress = true }; 
worker.DoWork += worker_DoWork; 
worker.Completed += worker_Completed; 
worker.RunWorkerAsync(); 

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    e.Result = vwAccVoucherDetails.ToList(); // vwAccVoucherDetails is the table containing records. 
} 

void worker_Completed(object sender, RunWorkerCompletedEventArgs e) { 
    dgvBalanceSheet.DataSource = e.Result; 
} 

按照this tutorial步驟關於如何使用的BackgroundWorker類的詳細說明。

+0

Thanxx的幫助,它現在完美的工作。 –

+0

我可以同時運行多少個後臺工作人員。 –

+1

@MurtazaMunshi儘可能多的機器允許/被配置爲允許 – CodingIntrigue

0

在後臺工作者上使用ProgressChangedRunWorkerCompleted回調(類似於DoWork事件處理)。這將在UI線程上完成,並且您不會遇到現在出現的困難。

0

您不能從後臺工作線程訪問UIThread,在這種情況下,您可以在backgroundWorker完成後填充網格,以便您可以將填充的datagrid代碼添加到worker_completed方法中,但是如果您想在工作進程中更新UI時,你必須實現InvokerRequired,BeginInvoke模式

+0

Yeaa我知道,我只是想調用所需的代碼。 –

+0

那麼invoke有什麼問題? – VahiD