привязка данных к данным, которые еще обрабатываются в другом потоке в wpf - PullRequest
0 голосов
/ 05 августа 2010

Просто поинтересовался, каков наилучший подход для этого сценария - попытка привязать данные к коллекции, которая заполняется в другом фоновом потоке.

Мой фоновый поток добавляет элементы в коллекцию в цикле обработки, который можетбегать несколько минут.Время от времени он вызывает событие для пользовательского интерфейса и передает ссылку на данные из коллекции для визуализации пользовательского интерфейса (чтобы пользователь мог начать взаимодействовать с тем, что у него есть) и продолжает обработку.

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

Итак, мой мозговой штурм прошел так:

  1. приостановить фоновую цепочку;но я действительно не хочу приостанавливать
  2. , чтобы получить дублирующую копию снимка всех или некоторые данные в каждом событии и привязать данные к снимку.Удваивает использование памяти, но, вероятно, сработает
  3. для реализации какой-либо блокировки {} в syncroot или любой другой коллекции, поэтому пока пользовательский интерфейс обновляет фоновый процесс, придется подождать.В любом случае, не уверен в том, что эта работа
  4. все время запускает событие и просто передает один бит данных за раз, что дает тот же результат, что и # 2, но с дополнительными издержками.

ура Ewart.

1 Ответ

0 голосов
/ 05 августа 2010

Самый простой способ решить вашу проблему - это изменить цикл foreach на цикл for, который переходит от 0 до количества элементов в вашей коллекции перед началом цикла.

вместо:

    var coll = new List<string>();
    foreach (string item in coll)
    {
        //do your stuff
    }

использование:

    var coll = new List<string>();
    int length = coll.Count - 1;
    for (int i = 0; i < length; i++)
    {

    }

ИЛИ

Я не знаю, насколько сложен ваш пользовательский интерфейс, но с WPF вы почти всегда можете изменить код на расширенную привязку данных, привязанную кObservableCollection.Коллекция Observable запускает обновление привязки при добавлении или удалении элемента.Но для решения этой проблемы требуется много информации о том, как строится ваш пользовательский интерфейс.

...