我试图弄清楚这一点,给定以下代码,Refresh() 是否需要在 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();
            });
    }
有帮助吗?

解决方案

根据 Microsoft 的文档 集合视图源 CollectionViewSource 对象不是线程安全的。据报道,这似乎不是线程安全的,尽管它似乎在许多情况下都有效。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top