BackgroundWroker跨线程操作无效

时间:2013-09-23 10:05:34

标签: c# multithreading datagridview backgroundworker

我创建了一个后台工作来填充datagirdview。使用从表中获取2000条记录的列表填充DatagridView。我使用后台工作程序删除了无响应的UI。

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的数据源而不会出现这类错误?

3 个答案:

答案 0 :(得分:3)

您需要使用BackgroundWorker的Completed事件:

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类的详细说明。

答案 1 :(得分:0)

在后台工作程序上使用ProgressChangedRunWorkerCompleted回调(类似于DoWork事件处理)。然后,这将在UI线程上完成,您将不会遇到现在出现的困难。

答案 2 :(得分:0)

您无法从后台工作线程访问UIThread,在这种情况下,您可以在backgroundWorker完成后填充网格,因此您可以将填充数据网格代码添加到worker_completed方法中,但是如果您希望在工作进行时更新UI,则必须实现InvokerRequired,BeginInvoke Pattern