[英]BackgroundWroker cross-thread operation not valid
我創建了一個背景工作人員來填充datagirdview。 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的數據源而又不會出現此類錯誤?
您需要使用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類的詳細說明。
在后台工作ProgressChanged
上使用ProgressChanged
或RunWorkerCompleted
回調(類似於DoWork
事件處理)。 然后,這將在UI線程上完成,您將不會遇到現在出現的困難。
您無法從后台工作線程訪問UIThread,在這種情況下,您可以在backgroundWorker完成后填充網格,因此可以將填充數據網格代碼添加到worker_completed方法中,但是如果您想在工作進程進行時更新UI,則必須實現InvokerRequired,BeginInvoke模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.