我试图解决这个问题,给定以下代码,是否需要在UI线程上进行Refresh()?它似乎工作,我想知道CollectionViewSource实际上是一个线程感知/安全对象?它肯定有支持调用正确线程的属性和方法,只是不确定是否留给开发人员,或者这是否在对象内完成?
public CollectionViewSource UserList { get; private set; }
void setupCollections()
{
UserList = new CollectionViewSource();
UserList.Source = searchProvider.UserResults;
UserList.SortDescriptions.Add(new SortDescription("DisplayName", ListSortDirection.Ascending));
}
这个线程在Silverlight中是否安全???
void RefreshUserList()
{
UserList.View.Refresh();
}
或者你需要做这样的事情吗?
void RefreshUserList()
{
// Is This Required?
UserList.Dispatcher.BeginInvoke(() =>
{
UserList.View.Refresh();
});
// Or MVVM-light Method
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
UserList.View.Refresh();
});
}
答案 0 :(得分:0)
根据CollectionViewSource的Microsoft文档,CollectionViewSource对象不是线程安全的。似乎没有报告这是线程安全的,即使它似乎在许多情况下都有效。
这可能是因为被调用的方法实际上是在View上,而不是CollectionViewSource。 View返回一个ICollectionView接口 - 支持类的详细信息未知,除了CreateView()方法创建它。
我建议我们始终认为这不是线程安全的并将其分派给正确的线程,尽管我对View.Refresh()的测试至少表明它是线程安全的。