2013-09-23 73 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