Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The calling thread cannot access this object because a different thread owns it

My code is as below

public CountryStandards() {     InitializeComponent();     try     {         FillPageControls();     }     catch (Exception ex)     {         MessageBox.Show(ex.Message, "Country Standards", MessageBoxButton.OK, MessageBoxImage.Error);     } }  /// <summary> /// Fills the page controls. /// </summary> private void FillPageControls() {     popUpProgressBar.IsOpen = true;     lblProgress.Content = "Loading. Please wait...";     progress.IsIndeterminate = true;     worker = new BackgroundWorker();     worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);     worker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(worker_ProgressChanged);     worker.WorkerReportsProgress = true;     worker.WorkerSupportsCancellation = true;     worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);     worker.RunWorkerAsync();                     }  private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {     GetGridData(null, 0); // filling grid }  private void worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {     progress.Value = e.ProgressPercentage; }  private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {     worker = null;     popUpProgressBar.IsOpen = false;     //filling Region dropdown     Standards.UDMCountryStandards objUDMCountryStandards = new Standards.UDMCountryStandards();     objUDMCountryStandards.Operation = "SELECT_REGION";     DataSet dsRegionStandards = objStandardsBusinessLayer.GetCountryStandards(objUDMCountryStandards);     if (!StandardsDefault.IsNullOrEmptyDataTable(dsRegionStandards, 0))         StandardsDefault.FillComboBox(cmbRegion, dsRegionStandards.Tables[0], "Region", "RegionId");      //filling Currency dropdown     objUDMCountryStandards = new Standards.UDMCountryStandards();     objUDMCountryStandards.Operation = "SELECT_CURRENCY";     DataSet dsCurrencyStandards = objStandardsBusinessLayer.GetCountryStandards(objUDMCountryStandards);     if (!StandardsDefault.IsNullOrEmptyDataTable(dsCurrencyStandards, 0))         StandardsDefault.FillComboBox(cmbCurrency, dsCurrencyStandards.Tables[0], "CurrencyName", "CurrencyId");      if (Users.UserRole != "Admin")         btnSave.IsEnabled = false;  }  /// <summary> /// Gets the grid data. /// </summary> /// <param name="sender">The sender.</param> /// <param name="pageIndex">Index of the page.( used in case of paging)   </pamam> private void GetGridData(object sender, int pageIndex) {     Standards.UDMCountryStandards objUDMCountryStandards = new Standards.UDMCountryStandards();     objUDMCountryStandards.Operation = "SELECT";     objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null;     DataSet dsCountryStandards = objStandardsBusinessLayer.GetCountryStandards(objUDMCountryStandards);     if (!StandardsDefault.IsNullOrEmptyDataTable(dsCountryStandards, 0) && (chkbxMarketsSearch.IsChecked == true || chkbxBudgetsSearch.IsChecked == true || chkbxProgramsSearch.IsChecked == true))     {         DataTable objDataTable = StandardsDefault.FilterDatatableForModules(dsCountryStandards.Tables[0], "Country", chkbxMarketsSearch, chkbxBudgetsSearch, chkbxProgramsSearch);         dgCountryList.ItemsSource = objDataTable.DefaultView;     }     else     {         MessageBox.Show("No Records Found", "Country Standards", MessageBoxButton.OK, MessageBoxImage.Information);         btnClear_Click(null, null);     } } 

The step objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; in get grid data throws exception

The calling thread cannot access this object because a different thread owns it.

What's wrong here?

like image 683
Kuntady Nithesh Avatar asked Mar 16 '12 06:03

Kuntady Nithesh


1 Answers

This is a common problem with people getting started. Whenever you update your UI elements from a thread other than the main thread, you need to use:

this.Dispatcher.Invoke(() => {     ...// your code here. }); 

You can also use control.Dispatcher.CheckAccess() to check whether the current thread owns the control. If it does own it, your code looks as normal. Otherwise, use above pattern.

like image 71
Candide Avatar answered Oct 02 '22 17:10

Candide