我正在编写(我的第一个)WPF应用程序,该应用程序搜索Web并在ListBox中显示链接。为了加速一切,我使用多个线程下载链接。但是,我遇到了一个有趣的多线程困境:
假设我有UI线程,然后产生另外2个线程来下载链接。现在,下载线程添加了一个名为List
LinkList
的链接,ListBox
绑定了LinkList
。如果Thread1更新LinkList
,则UI线程会尝试迭代ListBox
以重新绑定LinkList
。如果在UI线程迭代时,Thread2尝试将项添加到lock
,则会在UI线程上抛出异常,因为在迭代时无法将项添加到列表中。
我不想等到所有线程返回绑定ListBox,因为这意味着用户必须等待很长时间。有处理这个的模式吗?我可以以某种方式在迭代上围绕UI线程绑定放置{{1}}吗?
答案 0 :(得分:1)
INotifyCollectionChanged不是线程安全的(unline INotifyPropertyChanged),因此当从工作线程向LinkList添加项目时,应该使用调度程序从UI线程添加项目
var objectToAdd = ...
Dispatcher.Invoke(new Action(() =>
{
LinkList.Add(objectToAdd);
}));