1

次のコードを考えると、これを理解しようとしていますが、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();
            });
    }
4

1 に答える 1

0

CollectionViewSourceに関する Microsoft のドキュメントによると、CollectionViewSource オブジェクトはスレッドセーフではありません。多くの状況で機能するように見えますが、これはスレッドセーフであると報告されていないようです。

これは、呼び出されているメソッドが CollectionViewSource ではなく、実際にはビューにあることが原因である可能性があります。View はICollectionViewインターフェイスを返します - CreateView() メソッドがこれを作成することを除いて、サポートするクラスの詳細は不明です。

View.Refresh() の私のテストでは、少なくともスレッドセーフであることが示唆されていますが、これは常にスレッドセーフではないと考えて正しいスレッドにディスパッチすることをお勧めします。

于 2010-08-05T16:35:52.130 に答える