2008-12-13 2 views
2

поэтому у меня есть приложения winforms, которые загружают набор данных синхронно при запуске. Это, очевидно, занимает некоторое время, но тогда, когда загружается любая из сервисов или классов GUI, у всех этих данных есть эти данные. Я мог бы изменить это, чтобы добавить фоновый поток, но затем каждый компонент, который нуждается в доступе к этим данным, постоянно должен получать уведомление, когда эти данные были готовы. Это кажется плохим дизайном для каждого из моих классов, который зависит от того, какие данные должны быть загружены, чтобы иметь проверку If (Loaded) или подписаться на загруженное событие. , , есть идеи?Загрузка нескольких предварительных данных. , синхронизировать или асинхронно.

Любые другие идеи?

ответ

4

Я написал целый ряд приложений, которые имеют сходное поведение к тому, что вы описали, и есть три предложения для вас ...

Splash Screen

Добавить заставку в приложение, что отображает состояние нескольких этапов запуска. Я использовал это в прошлом, когда приложение имеет ряд шагов, которые должны выполняться при запуске, прежде чем пользователь получит приложение - подтверждение идентификации и авторизации доступа через Active Directory, контактную базу данных для получения системной информации, загрузку статические данные, первоначальный контакт с определенным веб-служб, проверяя, что предпосылками (как отчеты Crystal) установлены и работают, и т.д. и т.п.

подписка

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

Ленивая Загрузка

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

1

Я предлагаю вам использовать шаблон наблюдателя и настроить все классы, которые полагаются на загружаемый набор данных. Чтобы свести к минимуму время ожидания пользователя, вы также можете рассмотреть возможность внедрения двух категорий классов, для которых нужен весь набор данных, и функции, которые могут функционировать после загрузки подмножества данных.

Observer Design Pattern

+0

Хороший ответ! Я согласен и собираюсь опубликовать это, пока вы не избили меня до этого! – BobbyShaftoe 2008-12-13 03:34:32

1

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

Загрузка данных авансом против ленивой загрузки действительно является индивидуальной настройкой для каждого приложения. Я бы построил центральный объект данных, который обрабатывает оба сценария. Способ, которым я мог бы порекомендовать это, - создать модель зависимостей, зависящую от событий. Я имею в виду, что вы можете поместить функцию регистрации событий или обратного вызова на объект диспетчера данных, который подписываются различными единицами кода, когда им нужно использовать данные, а затем они возвращаются, когда данные доступны. Если данные уже доступны, то обратный вызов происходит немедленно. Иначе код кода вызывается назад, когда данные загружаются из фонового потока.Например, в каком-то окне или компоненте вы можете иметь некоторый код, который выглядит следующим образом:

DataManager.LoadDataAsync(dataCommandPatternObject, CallBackFunction); 

... 

public void CallbackFunction(SomeDataObjectClass data) 
{ 
    //load data into UI 
} 

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

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

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

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