【问题标题】:mvvm backgroundworker - CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher threadmvvm backgroundworker - CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection
【发布时间】:2018-03-22 22:33:05
【问题描述】:

我遇到的问题是我的后台工作人员在我第一次按下调用它的按钮时完成了工作,但第二次按下该按钮时会生成错误。错误标记在整数而不是集合上。

错误是“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。”代码行是“ t += 1;”也许我需要在不同的地方定义后台工作人员? 这是部分代码。

       public P4LabelBatteryViewModel()
    {
        BatteryCheckerModel BatteryCheckerModel = new BatteryCheckerModel();

        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        worker.RunWorkerCompleted += Worker_WorkerCompleted;

    }
     private void checkOutRestults()
    {
        TotalFiles = 0;

        foreach (var _scripObject in ScriptCollection)
        {
            if (_scripObject.ScriptNameAdd != "")
            {
                TotalFiles += 1;
            }
        }

        if (ScriptCollection.Count > 0)
        {
                        _isrunning = true;
                        worker.RunWorkerAsync();
        }  
    }
       void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        var t = e.ProgressPercentage;
        NewBatteryFiles += 1;
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        ScriptModel _newFileResult = new ScriptModel();
        int t = 0;

        _newFileResult = CheckOutResults.CheckOutResultBatteryFiles(BatteryLocation, SelectedMachine.Machine);
        ScriptCollectionTemp.Add(_newFileResult);
        t += 1;

        foreach (ScriptModel _checkOutFile in ScriptCollection)
        {
           _newFileResult = CheckOutResults.CheckOutResultFiles(_checkOutFile, BatteryLocation, SelectedMachine.Machine);
           ScriptCollectionTemp.Add(_newFileResult);
           t += 1;
           worker.ReportProgress(t);
        }
        //worker.ReportProgress(t);
    }
    void Worker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        foreach (ScriptModel _checkOutFile in ScriptCollectionTemp)
        {
            _checkOutFile.BackGround = new SolidColorBrush(Colors.LightGreen);
        }

        ScriptCollection = ScriptCollectionTemp;
    }

【问题讨论】:

    标签: c# multithreading mvvm


    【解决方案1】:

    没有控件会希望您在与 UI 线程不同的线程上更改它们。这就是世界的运作方式

    忽略其他问题,此模式将允许您从不同于 UI 上下文的上下文更新 UI

    Application.Current.Dispatcher.Invoke(
         () =>
            {
               // do any UI updates here
            });
    

    【讨论】:

    • 我仍然不明白为什么它第一次工作并第二次出错。我希望它每次都以相同的方式失败或工作。感谢您的回答,我会试试看。
    【解决方案2】:

    我修改了我的代码如下,它现在第二次工作了。

        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
          BackgroundWorker worker = sender as BackgroundWorker;
            ScriptModel _newFileResult = new ScriptModel();
            ObservableCollection<ScriptModel> _scriptCollectionTemp = new ObservableCollection<ScriptModel>();
    
            for (int i = 0; i < ScriptCollection.Count; i++ )
            {
                _newFileResult = CheckOutResults.CheckOutResultFiles(ScriptCollection[i], BatteryLocation, SelectedMachine.Machine);
                _scriptCollectionTemp.Add(_newFileResult);
                worker.ReportProgress(_scriptCollectionTemp.Count);
            }
            ScriptCollection = _scriptCollectionTemp;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多