c# - 从工作线程访问 UI 线程集合

标签 c# wpf multithreading mvvm

我正在 Visual studio 2012 中用 c# wpf 编写一个应用程序。我正在使用 mvvm。 我有一个 ObservableCollectionCriteriaCollection 属于 UI 线程,为了从数据库获取数据,我使用 Task.Factory 因为数据很大并保存在远程服务器上。 当我单击 GetData 按钮时,将执行以下代码。 我的代码是这样的:

void GetData(object obj)
{
        if (CriteriaCollection == null)         
        CriteriaCollection = new ObservableCollection<Criteria>();

        if (SelectedIndex != null && SelectedCriteria != null)
        { 
                bool results = this.CriteriaCollection.Any(report => 
                     report.CriteriaName.Equals(
                                 this.SelectedCriteria.CriteriaName.ToString()));
                if (!results)
                {
                    Task.Factory.StartNew(() =>
                    {
                        IsBusy = true;
                        Criteria newCriteria = new Criteria();

                        ExecuteGetDataFromDB(null);

                      ///some code which populates values and fills newCriteria

                        CriteriaCollection.Add(newCriteria);
                        }).ContinueWith(result =>
                        {
                            IsBusy = false;
                        });
                }
        }    
}

我在 CriteriaCollection.Add(newCriteria); 行遇到异常说 这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection。 有人可以帮我解决这个问题吗?

谢谢!

最佳答案

GUI 相关代码只能从 GUI 线程执行,或者使用另一个线程的调度程序执行:

Application.Current.Dispatcher.Invoke(new Action(() => 
{
    // your GUI related code here
}));

关于c# - 从工作线程访问 UI 线程集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012236/

相关文章:

c# - 构建前和构建后事件参数

c# - 如何通过调用构造函数提供只读属性的值?

带有用户控件的 WPF 数据绑定(bind)

WPF 交互在样式中触发以调用 View 模型上的命令

WPF 主题错误 : Cannot resolve all property references in the property path

.net - 为什么WinDbg、任务管理器和VS Debugger 报告的线程数不同?

c# - 幂集生成函数的时间复杂度

javascript - C#和javascript之间的加密结果差异

java - Android 中的暂停和恢复线程。工作室

java - ThreadPoolTask​​Executor 没有执行提交给它的所有线程