无法获得Begin.Invoke,ObservableCollection和后台线程工作

时间:2015-04-27 08:49:21

标签: c# wpf multithreading user-interface listbox

这可能是一个简单/愚蠢的问题,但我不能简单地让标题中的三件事情起作用。我遵循以下SO答案的建议: WPF listbox dynamically populated - how to get it to refresh?

  

创建一个ObservableCollection并将ListBox.ItemsSource设置为该集合。由于集合是可观察的,因此ListBox将随着其内容的更改而更新。

     

但是,如果您的实际操作阻止了UI线程,则可能会这样做   在操作完成之前阻止WPF更新UI   (因为WPF数据绑定基础结构没有机会   跑)。因此,您可能需要在后台运行冗长的操作   线。在这种情况下,您将无法更新   由WPF引起的后台线程的ObservableCollection   跨线程限制(您可以更新属性,但不能   集合)。要解决此问题,请使用Dispatcher.BeginInvoke()   在继续操作的同时更新UI线程上的集合   在后台线程。

我创建了ObservableCollection并将其附加到我的ListBox的ItemSource:

private ObservableCollection<Employee> employeeList;
searchList.ItemsSource = employeeList;

我创建一个线程并指示它运行填充ObservableCollection的函数(我正在传递文本字符串和ObservableCollection):

Thread thread = new Thread(() => ldapConnector.Search(textbox.Text, employeeList));
thread.Start();

当我启动程序时,ldapConnector是我初始化的一个单独的类。然后我得到以下错误(指向线程创建行):

  

调用线程无法访问此对象,因为它不同   线程拥有它。

正如我从该帖子中所理解的那样,我需要在创建线程后立即运行Begin.Invoke()方法:

Dispatcher.BeginInvoke(new Action(()=>{
    searchList.ItemsSource = employeeList;
}));

我做错了什么以及如何解决?

0 个答案:

没有答案