数据绑定到仍在wpf中的另一个线程上处理的数据

时间:2010-08-05 05:37:33

标签: wpf data-binding multithreading background

只是想知道这个场景的最佳方法是什么 - 尝试数据绑定到正在另一个后台线程中填充的集合。

我的后台主题是在处理循环中将项目添加到集合中,该循环可能会运行几分钟。它偶尔会向UI引发一个事件,并传递对集合中数据的引用,以便UI可视化(因此用户可以开始与他们拥有的内容进行交互)并继续处理。

麻烦是UI开始呈现可视化(这本身就非常复杂),它涉及到数据集合上的foreach()循环,并且可以理解的是,如果我的后台线程在集合期间更改了集合中的数据,那么循环就会自行崩溃枚举。

所以我的头脑风暴就像这样:

  1. 暂停后台线程;但我真的不想暂停
  2. 获取所有事件的重复快照副本,或每个事件中的一些数据,并将数据绑定到快照。将我的内存使用量翻倍但可能会有效
  3. 在同步根或任何集合上实现某种锁{},因此在UI更新时,后台进程必须等待。对此工作毫无信心
  4. 一直触发事件,一次只传递一位数据,结果与#2相同,但开销更大..
  5. 欢呼声   尤尔特。

1 个答案:

答案 0 :(得分:0)

解决问题的最简单方法是将foreach循环更改为for循环,在开始循环之前,循环从0循环到集合中的项目数。

而不是:

    var coll = new List<string>();
    foreach (string item in coll)
    {
        //do your stuff
    }

使用:

    var coll = new List<string>();
    int length = coll.Count - 1;
    for (int i = 0; i < length; i++)
    {

    }

OR

我不知道您的UI有多复杂但是使用WPF几乎总是可以将代码更改为绑定到ObservableCollection的高级数据绑定。添加或删除项目时,Observable集合会触发绑定更新。 但要为此提供解决方案,需要有关如何构建UI的大量信息。