我创建了一个后台工作来填充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的数据源而不会出现这类错误?
答案 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)
在后台工作程序上使用ProgressChanged
或RunWorkerCompleted
回调(类似于DoWork
事件处理)。然后,这将在UI线程上完成,您将不会遇到现在出现的困难。
答案 2 :(得分:0)
您无法从后台工作线程访问UIThread,在这种情况下,您可以在backgroundWorker完成后填充网格,因此您可以将填充数据网格代码添加到worker_completed方法中,但是如果您希望在工作进行时更新UI,则必须实现InvokerRequired,BeginInvoke Pattern