0

我创建了一个后台工作人员来填充数据网格视图。DatagridView 使用从表中获取 2000 条记录的列表填充。我使用后台工作人员来删除无响应的 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 的数据源而不会出现此类错误?

4

3 回答 3

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;
}

按照本教程中的步骤获取有关如何使用 BackgroundWorker 类的详细说明。

于 2013-09-23T10:08:43.513 回答
0

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

于 2013-09-23T10:08:30.453 回答
0

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

于 2013-09-23T10:14:20.620 回答