1

我想弄清楚,鉴于下面的代码,刷新()需要发生在UI线程?它似乎工作,我想知道如果CollectionViewSource实际上是一个线程感知/安全的对象?它肯定有属性和方法来支持调用正确的线程,只是不确定是否由开发人员决定,还是在对象内完成?Silverlight的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

每微软的文档上CollectionViewSource的CollectionViewSource对象不是线程安全的。看起来这并不是线程安全的,即使它似乎在很多情况下都能正常工作。

这可能是因为被调用的方法实际上是在View上,而不是CollectionViewSource。该视图返回一个ICollectionView接口 - 支持类的详细信息未知,但CreateView()方法创建该接口。

我建议我们总是认为这不是线程安全的,并将其分发到正确的线程,尽管我对View.Refresh()的测试至少表明它是线程安全的。