Загрузка большого количества предварительных данных. , синхронизация или асинхронность

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

Есть еще идеи?

13.12.2008 02:13:26
3 ОТВЕТА
РЕШЕНИЕ

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

Заставка

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

Подписка

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

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

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

4
13.12.2008 02:47:11

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

Шаблон дизайна наблюдателя

1
13.12.2008 03:05:06
Хороший ответ! Я согласен и собирался опубликовать это, пока вы не победили меня в этом!
BobbyShaftoe 13.12.2008 03:34:32

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

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

DataManager.LoadDataAsync(dataCommandPatternObject, CallBackFunction);

...

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

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

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

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

1
13.12.2008 17:17:57