none
Методы Add(0 и AddNew в BindingList RRS feed

  • Вопрос

  • Использую BimdimgList как коллекцию элементов своего пользовательского класса, пустай класса "A" (для отображения коллекции элементов класса "А" на экране). Добавляю элементы в BindingList с помощью его метода Add(). Поскольку BindingList создан в классе главного окна приложения (в треде UI), а элементы в него добавляются в другом треде, то добавлять приходится через вызов

    this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
    { pendingBuffer.Add(element); });

    element - экземпляр вышеупомянутого пользовательского класса "А" создаётся локально каждый раз перед его помещением в BindingList. Проверяя код в отладчике заметил, что при передаче функции добавления элемента в тред UI, элемент не всегда сразу добавляется в коллекцию (а иногда, похоже, и просто не добавляется), а иногда добавление запаздывает. А мне это "не выгодно". Вопрос такой. Может быть лучше использовать для добавления метод AddNew() вместо Add()? Там как я понимаю несколько другой порядок добавления с использованием обработчика события, возникающего при добавлении элемента, и не нужно делать передачу операции добавления (по крайней мере явно) в тред UI? Вобще у AddNew есть какие преимущества перед Add()?


    • Изменено TownSparrow 7 марта 2013 г. 9:47
    7 марта 2013 г. 9:46

Ответы

  • Если я поменяю DispatcherPriority.Normal на DispatcherPriority.Send это может помочь в моём случае?

    Пробуйте, но учтите, что подтормаживать будет что то другое. Вообще, что бы дать вам более конкретную рекомендацию информации маловато. Что конкретно грузит процессор и грузит ли его вообще что либо? Что за DataTemplate в UI (тормоза могут быть в нем)? И т.д. и т.п. Если проблема будет сильно докучать, то посмотрите на это. Главное, что я скажу сам факт добавления класса в коллекцию не может быть настолько тяжелым что бы вызывать подмораживание. Загрузка данных из интеренета (если есть), построение UI это все да, а на этапе Add тормозить нечему.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа TownSparrow 7 марта 2013 г. 14:42
    • Снята пометка об ответе TownSparrow 7 марта 2013 г. 14:49
    • Помечено в качестве ответа TownSparrow 11 марта 2013 г. 5:33
    7 марта 2013 г. 10:40
    Отвечающий

Все ответы

  • В вашем случае скорее дело в Dispatcher.BeginInvoke. Дело в том, что Dispatcher ставит выполнение в очередь и ожидает выполнения кода с более высоким приоритетом и уж потом выполняет код сам. На слабой машине и при высокой загрузке процессора это может оказаться заметным. Обычно же очередь отстаивается меньше чем за пол секунды.

    Ну а различия между Add и AddNew читайте в соответствующих статьях MSDN, на которые я дал ссылки.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    7 марта 2013 г. 10:11
    Отвечающий
  • Если я поменяю DispatcherPriority.Normal на DispatcherPriority.Send это может помочь в моём случае?

    7 марта 2013 г. 10:33
  • Если я поменяю DispatcherPriority.Normal на DispatcherPriority.Send это может помочь в моём случае?

    Пробуйте, но учтите, что подтормаживать будет что то другое. Вообще, что бы дать вам более конкретную рекомендацию информации маловато. Что конкретно грузит процессор и грузит ли его вообще что либо? Что за DataTemplate в UI (тормоза могут быть в нем)? И т.д. и т.п. Если проблема будет сильно докучать, то посмотрите на это. Главное, что я скажу сам факт добавления класса в коллекцию не может быть настолько тяжелым что бы вызывать подмораживание. Загрузка данных из интеренета (если есть), построение UI это все да, а на этапе Add тормозить нечему.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа TownSparrow 7 марта 2013 г. 14:42
    • Снята пометка об ответе TownSparrow 7 марта 2013 г. 14:49
    • Помечено в качестве ответа TownSparrow 11 марта 2013 г. 5:33
    7 марта 2013 г. 10:40
    Отвечающий
  • Приложение многопоточное и в нём 6 тредов (правда некоторые из них могут быть не активными, а находиться в состоянии ожидания сигнала (WaitOne) от событий AutoResetEvent. Но периодически события их "будят" и кто-то из них переходит в активное состояние. Вот из за контекстного переключения между тредами может быть затормозка?
    7 марта 2013 г. 11:03
  • Факт тот, что когда смотрю в отладчике, то явно прохожу через строку кода с методом Add и он по идее должен выполниться. А когда после этого проверяю свойство Count, то оно оказывается равным нулю.
    7 марта 2013 г. 14:51