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()的測試至少表明它是線程安全的。