簡體   English   中英

BackgroundWroker跨線程操作無效

[英]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上使用ProgressChangedRunWorkerCompleted回調(類似於DoWork事件處理)。 然后,這將在UI線程上完成,您將不會遇到現在出現的困難。

您無法從后台工作線程訪問UIThread,在這種情況下,您可以在backgroundWorker完成后填充網格,因此可以將填充數據網格代碼添加到worker_completed方法中,但是如果您想在工作進程進行時更新UI,則必須實現InvokerRequired,BeginInvoke模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM