Все Я делаю в настольном приложении, будь то Winforms или WPF, я пытаюсь сделать это в фоновом потоке. Это сделано по двум причинам. Во-первых, пользовательский опыт лучше. Во-вторых, в тестировании WPF я обнаружил, что он лучше работает при загрузке большого количества данных, например записей в сетку или список.
Загрузка данных по сравнению с отложенной загрузкой - это настройка для каждого приложения. Я бы построил центральный объект данных, который обрабатывает оба сценария. Способ, которым я мог бы рекомендовать сделать это, состоит в том, чтобы создать управляемую событиями модель зависимости. Под этим я подразумеваю, что вы можете поместить функцию регистрации события или обратного вызова на объект диспетчера данных, на который подписываются различные блоки кода, когда им нужно использовать данные, и затем они отзываются, когда данные доступны. Если данные уже доступны, обратный вызов происходит немедленно. Иначе, блок кода вызывается обратно, когда данные загружаются из фонового потока. Например, в каком-то окне или компоненте у вас может быть какой-то код, похожий на:
DataManager.LoadDataAsync(dataCommandPatternObject, CallBackFunction);
...
public void CallbackFunction(SomeDataObjectClass data)
{
//load data into UI
}
Если загрузка данных осуществляется через центральный механизм, то, если одни и те же данные запрашиваются дважды, можно использовать версию кэша или второй запрос может подождать, если первый запрос все еще выполняется.
Если данные должны быть загружены заранее, экран загрузки (заставка) может запрашивать количество фрагментов данных, и при загрузке каждого блока данных вызывается обратный вызов. Когда все обратные вызовы сработали, появляется заставка.
Это всего лишь несколько моментов из нескольких различных техник, которые я использовал на протяжении многих лет для управления загрузкой больших наборов данных, в основном статических данных / данных поиска. Вдобавок ко всему, я бы также порекомендовал какой-то вид кэширования диска на стороне клиента для очень больших наборов данных, которые редко меняются, и внедрил бы своего рода отслеживание изменений в базе данных. Это позволит клиенту загружать эти данные с локального диска, что быстрее, чем при переходе в БД. Это также позволяет лучше масштабировать БД, поскольку она не передает данные с высокой степенью повторяемости, а вместо этого может сосредоточиться на транзакционных данных.