c # UWP параллельная загрузка изображений - PullRequest
0 голосов
/ 16 октября 2019

У меня есть решение C # UWP для себя, и я определил специальный манифест broadFileSystemAccess, чтобы я мог получить доступ ко всем файлам с моего компьютера напрямую.

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

foreach (var item in someList)
{
    BitmapImage bitmapImage = new BitmapImage();

    StorageFile file = await StorageFile.GetFileFromPathAsync(item.ImagePath);
    using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
    {
        await bitmapImage.SetSourceAsync(fileStream);
    }

    someOtherList.Add(new someModel { ... });
};

В каком-то другом потоке я обнаружил использование Parallel.ForEach - но это не поддерживает асинхронные вызовы,Затем я увидел библиотеку под названием Dasync с using Dasync.Collections. Однако использование этой функции просто вызывает ошибку, сообщающую что-то об интерфейсе, который был упорядочен для другого потока, который был вызван приложением (грубо переведено), поэтому я подумал, что библиотека также может не подходить для этой задачи.

Как бы распараллелить это в приложении C # UWP?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

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

Рекомендуется использовать для чтения файлов способ разрезания данных. Например, прочитайте 10 изображений один раз, в следующий раз прочитайте другие 10 изображений. И GridView - это элемент управления виртуализацией, который может освободить память, когда элемент прокручивается из экрана. Для получения дополнительной информации, вы можете сослаться на это дело ответить .

0 голосов
/ 17 октября 2019

Вы можете запустить все задачи, а затем дождаться их завершения, используя Task.WhenAll:

Func<Item, Task<BitmapImage>> f = async (item) =>
{
    BitmapImage bitmapImage = new BitmapImage();

    StorageFile file = await StorageFile.GetFileFromPathAsync(item.ImagePath);
    using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
    {
        await bitmapImage.SetSourceAsync(fileStream);
    }
    return bitmapImage;
};

BitmapImage[] bitmapImages = await Task.WhenAll(someList.Select(f).ToArray());
...