为了账号安全,请及时绑定邮箱和手机立即绑定

调用线程无法访问此对象,因为其他线程拥有该对象。

调用线程无法访问此对象,因为其他线程拥有该对象。

慕仙森 2019-06-10 21:03:18
调用线程无法访问此对象,因为其他线程拥有该对象。我的代码如下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");步骤objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null;在GET网格中,数据抛出异常。调用线程无法访问此对象,因为其他线程拥有该对象。这里怎么了?
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

另一个很好的用途Dispatcher.Invoke用于在执行其他任务的函数中立即更新UI:

// Force WPF to render UI changes immediately with this magic line of code...Dispatcher.Invoke(new Action(() => { }), 
.DispatcherPriority.ContextIdle);

我使用它将按钮文本更新为“处理.。“同时禁用它WebClient请求。


查看完整回答
反对 回复 2019-06-10
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

要添加我的2美分,即使您通过以下方式调用代码,也可能出现异常System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke()
关键是你得打电话给Invoke().的.Dispatcher.的.控制您试图访问的,在某些情况下可能与System.Windows.Threading.Dispatcher.CurrentDispatcher..所以你应该用YourControl.Dispatcher.Invoke()为了安全起见。在我意识到这一点之前我敲了几个小时的头。

更新

对于未来的读者来说,这似乎在较新版本的.NET(4.0及以上版本)中发生了变化。现在,在更新VM中的UI备份属性时,您不必再担心正确的调度器。WPF引擎将在正确的UI线程上封送跨线程调用。见更多细节这里..感谢@aaronburro的信息和链接。你也可以在下面的评论中阅读我们的对话。


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 1443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信