猿问

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

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

我的代码如下

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网格中,数据抛出异常。

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

这里怎么了?


慕仙森
浏览 1444回答 3
3回答

明月笑刀无情

另一个很好的用途Dispatcher.Invoke用于在执行其他任务的函数中立即更新UI://&nbsp;Force&nbsp;WPF&nbsp;to&nbsp;render&nbsp;UI&nbsp;changes&nbsp;immediately&nbsp;with&nbsp;this&nbsp;magic&nbsp;line&nbsp;of&nbsp;code...Dispatcher.Invoke(new&nbsp;Action(()&nbsp;=>&nbsp;{&nbsp;}),&nbsp; .DispatcherPriority.ContextIdle);我使用它将按钮文本更新为“处理.。“同时禁用它WebClient请求。

慕姐8265434

要添加我的2美分,即使您通过以下方式调用代码,也可能出现异常System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke().&nbsp;关键是你得打电话给Invoke().的.Dispatcher.的.控制您试图访问的,在某些情况下可能与System.Windows.Threading.Dispatcher.CurrentDispatcher..所以你应该用YourControl.Dispatcher.Invoke()为了安全起见。在我意识到这一点之前我敲了几个小时的头。更新对于未来的读者来说,这似乎在较新版本的.NET(4.0及以上版本)中发生了变化。现在,在更新VM中的UI备份属性时,您不必再担心正确的调度器。WPF引擎将在正确的UI线程上封送跨线程调用。见更多细节这里..感谢@aaronburro的信息和链接。你也可以在下面的评论中阅读我们的对话。
随时随地看视频慕课网APP
我要回答