Как я могу создать общий элемент управления из потока backgroundWorker? - PullRequest
0 голосов
/ 17 августа 2010

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

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

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

  • Вызовите Webservice async

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

  • в методе 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();
    }

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

И хотя я создаю около 450 объектов таким образом, я бы хотел сохранить создание объектной модели в фоновом режиме без уменьшенияпроизводительность с ThreaСпи или другие "замечательные" методы.

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

Ответы [ 2 ]

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

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

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

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

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

@ Джереми, я полагаю, что MVVM - лучшее решение для реализации вашего решения? Я буду читать для реактивных расширений. Спасибо.

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

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

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

...