Кэширование данных UWP KnownFolder

Я пытаюсь выполнить следующие задачи с KnownFolders, а именно: VideoLibrary в моем приложении UWP

  1. Более быстрое время загрузки. (Мне нужно загрузить миниатюры и имена файлов из KnownFolders, что может занять немного больше времени, если в библиотеке огромное количество файлов. Есть ли более быстрый способ кэширования и хранения их, возможно, в базе данных sqlite, и при каждом следующем запуске просто получить их из БД, это может быть быстрее?

  2. Синхронизация с изменениями системных файлов (если новый файл добавляется или удаляется в этой конкретной библиотеке во время работы приложения, как приложение может быть уведомлено об этом)

  3. По сути, я хочу, чтобы приложение загружало данные библиотеки быстрее при открытии, что бы рекомендовать для достижения этой цели? Должен ли я использовать фоновое задание для приложения? но хранение данных в памяти, когда приложение не запущено, не может быть хорошим решением или нет? или, может быть, я смогу начать процесс извлечения данных в App.xaml.cs, как только приложение запустится (до перехода на страницу библиотеки), это улучшит производительность?

  4. В основном: я ищу некоторые предложения и обсуждения здесь, потому что здесь не может быть строгого ответа на мой вопрос. Заранее спасибо, любое предложение будет оценено. Мои главные 2 цели - синхронизировать библиотеку с удалением и добавлением файлов в физическую папку и улучшить производительность загрузки библиотеки в приложении. (и да, я также загружаю библиотеку в виде сетки с миниатюрами.

1 ответ

Решение
StorageFileQueryResult fileQuery;

async void CreateWatchFolder(StorageFolder folder)
    {
        var options = new QueryOptions();
        options.FolderDepth = FolderDepth.Deep;
        fileQuery = folder.CreateFileQueryWithOptions(options);
        _fileQuery.ContentsChanged += OnContentsChanged;
        var files = await _fileQuery.GetFilesAsync();
    }

    async void OnContentsChanged(IStorageQueryResultBase sender, object args)
    {
        // Do stuff, e.g. check for changes
    }

Для #2 вашего вопроса, это даст вам папку с часами. Каждый раз, когда происходит изменение в этом StorageFolder, оно запускает событие. Он не знает, какие изменения были внесены в файл, но вы можете написать код для проверки каждый раз. Смотрите здесь для более подробной информации.

Относительно № 1, действительно трудно сказать, что стоит попробовать. Лично у меня была ужасная производительность, когда я играл с Sqlite и EF с UWP, но я не эксперт в этом.

Вопрос № 3, вы можете рассмотреть вопрос о кэшировании своих миниатюр в одну из папок с данными приложения. LocalCache был бы очевидным выбором, но на самом деле, если вы делаете только Local, вы можете связать пути URI для источников изображений в вашем UI. Это не работает с изображениями в LocalCache, которые я проверял в последний раз (около марта или около того), но работает с Local. Это намного быстрее, чем загружать файл как StorageFile и затем создавать растровое изображение с ним.

Другие вопросы по тегам