Безопасна ли привязка WPF к параллельным коллекциям? - PullRequest
0 голосов
/ 25 ноября 2018

Мне было интересно, безопасно ли связывать элемент управления WPF с параллельной коллекцией, в частности, с классом-оболочкой для одной из System.Collections.Concurrent коллекций, которая также реализует INotifyCollectionChanged?

Я понимаю, что CollectionChanged должен вызываться в потоке пользовательского интерфейса (и без параметров индекса).Но что произойдет, если другой поток манипулирует исходной коллекцией во время обновления интерфейса?WPF просто изящно игнорирует проблему (как это происходит во многих других местах)?

1 Ответ

0 голосов
/ 25 ноября 2018

Это зависит от реализации вашей обертки.Давайте создадим простой пример, добавив INotifyCollectionChanged к BlockingCollection<T>, разрешающему вызовы потоков, отличных от пользовательского интерфейса:

public void AddNotified(T item)
{
    base.Add(item);

    var args = new NotifyCollectionChangedEventArgs(
        NotifyCollectionChangedAction.Add,
        item,
        Count - 1);

    //Ensure no items are changed until the UI is updated

    Application.Current.Dispatcher.Invoke(() =>
        CollectionChanged?.Invoke(this, args));
}

Реализация Add сама по себеПотокобезопасен, но для уверенности в том, что пользовательский интерфейс отображает текущие элементы, реализация которых вам необходима, чтобы гарантировать, что между добавлением и обновлением не будет никаких других элементов (см. комментарий в коде).

WPF обновляет пользовательский интерфейс на основеNotifyCollectionChangedAction и обновленные предметы переданы при поднятии INotifyCollectionChanged.CollectionChanged.Это означает, что пользовательский интерфейс полагается на эту информацию.Результат: временное обновление коллекции приводит к несинхронизированному пользовательскому интерфейсу до тех пор, пока не будет выполнено обновление или не будет вызван NotifyCollectionChangedAction.Reset, и пользовательский интерфейс отображает различные элементы, как внутри вашей исходной коллекции.

Синхронизация коллекций с пользовательским интерфейсом оченьширокая и интересная тема.Уже есть несколько доступных решений, которые могут соответствовать вашей конкретной проблеме.Чтобы дать вам несколько возможных подходов к решению подобных проблем, взгляните на следующие ссылки:

...