0

У меня возникли проблемы при использовании фонового работника для создания моей объектной модели.Как я могу создать общий элемент управления из потока backgroundWorker?

Как я понимаю, я не могу найти обходное решение.

Вот псевдо логика:

  • Вызов Вебсервис асинхронной

  • При получении открыть фоновый рабочий, и загружать данные в элементы управления в фоновом режиме

  • в методе Load , найдите существующий объект и, если он не найден, создайте новый.

Все объекты, созданные наследуемыми от Control (с прозрачным абстрактным слоем).

В то время как я создаю элементы управления в главном потоке, то функция отлично работает:

public static T Find<T>(ObservableCollection<T> collection, int objectId) 
     where T : FormaliteBaseControl, new() 
    { 
     foreach (T item in collection) 
     { 
      if (item.ObjectId == objectId) 
       return item; 
     } 

     return new T(); 
    } 

Конечно, при вызове из фонового потока, поперечное исключение резьбы происходит в «новом Т()» В Silverlight , нет способа вызвать Dispatcher.Invoke синхронно.

И хотя я создаю около 450 объектов таким образом, я хотел бы сохранить создание объектной модели на фоне без снижения производительности с помощью Thread.Sleep или других «отличных» методов.

Спасибо за ваши ответы.

+0

В каком контейнере находятся элементы управления 450 UI? Элемент ItemsControl или ListBox? Что-то, что виртуализировано? – WiredPrairie

+0

Поскольку вы используете поток, вы можете столкнуться с проблемами с коллекцией, которую используете, - если вы изменяете коллекцию из другого потока (в то время как другой поток использует перечислитель через foreach). – WiredPrairie

ответ

0

Вы создаете личный контроль пользовательского интерфейса? Вот что я подразумеваю. Если это так, кажется, нет смысла делегировать это фоновому потоку. Зачем? В конечном итоге, в конечном итоге это объекты UI, поэтому они должны создаваться в потоке пользовательского интерфейса. Я знаю, что вас беспокоит блокировка, но вся ваша основная работа заканчивается тем, что ее нужно перевести обратно в пользовательский интерфейс.

Возможно, лучшим вариантом для этого будет предоставление паба/вспомогательной модели. Вы можете создать поток, который имеет логику для фонового потока, но никогда не будет создавать экземпляр объекта. Вместо этого он опубликует запрос. В потоке пользовательского интерфейса вы слушаете и создаете объекты. Reactive Extensions (Rx) были бы особенно полезны для этого, потому что вы можете преобразовать ObservableCollection в Observable, а затем перевести итерации в пользовательский интерфейс.

0

Спасибо за вас.

Мои элементы управления создают дерево. На самом деле корневой объект содержит 4 расширения, которые получили элемент управления как дочерний элемент (содержит 45 объектов). Каждый из этих дочерних объектов получил еще один расширитель с элементом управления элементами, имеющим около 10 дочерних элементов.

@WPCoder: Поскольку ItemsControl редко содержит более 10 объектов и очень редко 45, и потому, что элементы могут иметь несколько высоту и ребенка, виртуализация did'nt помочь мне (да, я пробовал)

После некоторого теста я вижу, что это шаг шаблонов, который занимает это время. Мое объявление объекта вписывается в секунду. Поэтому я использовал обходной путь, чтобы первые глубокие объекты рухнули, когда объектная модель стала большой. Пользователи сохраняют возможность принудительного расширения при запуске в качестве параметра, но они знают обратную сторону этого метода.

@ Jeremy, я полагаю, что MVVM - лучшее решение для реализации вашего решения? Я прочитаю для реактивных расширений. Благодарю.

Смежные вопросы