DataBinding和锁定列表

时间:2010-12-23 16:06:33

标签: wpf multithreading data-binding mvvm

我正在编写(我的第一个)WPF应用程序,该应用程序搜索Web并在ListBox中显示链接。为了加速一切,我使用多个线程下载链接。但是,我遇到了一个有趣的多线程困境:

假设我有UI线程,然后产生另外2个线程来下载链接。现在,下载线程添加了一个名为List LinkList的链接,ListBox绑定了LinkList。如果Thread1更新LinkList,则UI线程会尝试迭代ListBox以重新绑定LinkList。如果在UI线程迭代时,Thread2尝试将项添加到lock,则会在UI线程上抛出异常,因为在迭代时无法将项添加到列表中。

我不想等到所有线程返回绑定ListBox,因为这意味着用户必须等待很长时间。有处理这个的模式吗?我可以以某种方式在迭代上围绕UI线程绑定放置{{1}}吗?

1 个答案:

答案 0 :(得分:1)

INotifyCollectionChanged不是线程安全的(unline INotifyPropertyChanged),因此当从工作线程向LinkList添加项目时,应该使用调度程序从UI线程添加项目

var objectToAdd = ...
Dispatcher.Invoke(new Action(() =>
{
    LinkList.Add(objectToAdd);
}));