2010-01-26 5 views
3

У меня есть коллекция «активных объектов». То есть объекты, которые необходимо предварительно обновить сами. В свою очередь, эти объекты должны использоваться для обновления GUI на основе WPF.WPF и активные объекты

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

В нормальных условиях интервал обновления составляет 1 секунду, но это может занять до 30 секунд из-за тайм-аутов.

Итак, какой дизайн вы бы порекомендовали?

+0

Какое событие вы хотите обновить? – Zied

+0

Как правило, в какой-то форме таймера нет внешних событий для подключения. –

ответ

0

Я не эксперт, но я просто хотел, чтобы объекты загорались событием, указывающим, когда они изменились. Затем GUI может обновлять необходимые части (легко при использовании привязки данных и INotifyPropertyChanged) всякий раз, когда он получает событие.

+0

Это легко. Жесткая часть рассказывает об объекте, когда сначала обновляется, без какого-либо нажатия пользователем кнопки обновления. –

+0

Возможно, я не понимаю ваш вопрос. Разве каждый объект не обрабатывает свои собственные обновления? Каждый объект может иметь свой собственный таймер и таймаут. Затем всякий раз, когда объект обнаруживает событие, сообщающее об этом, он уведомляет GUI. –

0

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

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

Код основного обновления затем может использовать один таймер (или несколько или что-то подходящее), чтобы определить, когда получать обновления. Выполнение этого как большего потока данных, и меньше «обновления состояния», вероятно, сэкономит много здравого смысла в конце.

+0

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

+0

Мне не очень нравится инкапсулировать «данные» (обычно объекты домена) с кодом сохранения, так как он имеет тенденцию создавать высокие степени сцепления, которые могут быть очень трудными для работы в долгосрочной перспективе. Но есть веские причины, чтобы иметь эту связь. – kyoryu

1

Вы можете использовать один диспетчер (планировщик) для всех или группы активных объектов. Диспетчер может обрабатывать высокоприоритетные задачи в первую очередь, а затем другие. Вы можете увидеть это article про долгосрочные активные объекты с кодом, чтобы узнать, как это сделать. В дополнение я рекомендую посмотреть на Half Sync/Half Async. Если у вас есть вопросы - добро пожаловать.

+0

Что такое шаблон Half Sync/Half Async? –

+0

Думаю, лучше прочитать этот документ www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf. Вскоре у нас есть активные объекты, которые выполняют свои собственные задачи (синхронные задачи или процессы пользователя) и некоторые внешние задачи, которые выполняются несинхронно (низкие события или вызовы из других подсистем). – garik

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