1

鉴于以下代码,我试图弄清楚这一点,刷新()是否需要在 UI 线程上发生?它似乎有效,我想知道 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();
            });
    }
4

1 回答 1

0

根据 Microsoft 关于CollectionViewSource的文档, CollectionViewSource 对象不是线程安全的。似乎这不是线程安全的,尽管它似乎在许多情况下都有效。

这可能是因为被调用的方法实际上是在 View 上,而不是 CollectionViewSource。View 返回一个ICollectionView接口——支持类的细节是未知的,除了 CreateView() 方法创建它。

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

于 2010-08-05T16:35:52.130 回答