Не удается правильно прочитать все файлы из StorageFile в приложении Windows 8 metro - PullRequest
0 голосов
/ 05 марта 2012

Я разрабатываю простое приложение в приложениях Windows 8 Metro и пытаюсь извлечь файлы из PicturesLibrary, код, который я ввел, выглядит следующим образом:

public async void Initialize()
{
    IReadOnlyList<StorageFile> storageFiles = await KnownFolders.PicturesLibrary.GetFilesAsync();              
    foreach (var storageFile in storageFiles)
    {   
        BitmapImage bitmapImage = new BitmapImage();
        FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);
        bitmapImage.SetSource(stream);
        Image image = new Image();
        image.Source = bitmapImage;
        Images.Add(image);
    }
}

, затем я показываю эти изображения, используя их ImageSource,Проблема, с которой я сталкиваюсь, состоит в том, что иногда он показывает их все, иногда один или два, иногда это не показывает никакого изображения, я не понимаю, если это из-за ожидаемого метода GetFileAsync () или других вещей, которые я могу бытьотсутствует.

Заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Я бы предположил, что это просто проблема синхронизации, но выполнение точки останова или точки трассировки в foreach точно скажет.

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

0 голосов
/ 06 марта 2012

Хорошо, я нашел решение для этого благодаря вам, ребята, мне пришлось немного переставить код,

public async Task Initialize()
        {   
            IReadOnlyList<StorageFile> storageFiles = await KnownFolders.PicturesLibrary.GetFilesAsync();              
            foreach (var storageFile in storageFiles)
            {
                var image = new Image();
                image.Source = await GetBitmapImageAsync(storageFile);
                Images.Add(image);
            }
        }

        public async Task<BitmapImage> GetBitmapImageAsync(StorageFile storageFile)
        {
            BitmapImage bitmapImage = new BitmapImage();
            IAsyncOperation<IRandomAccessStream> operation = storageFile.OpenAsync(FileAccessMode.Read);
            IRandomAccessStream stream = await operation;
            bitmapImage.SetSource(stream);
            return bitmapImage;
        }

, затем вызвать все это в событии OnNavigateTo, так как конструктор не может быть асинхронным

 protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            _imageList = new ImagesList();
            await _imageList.Initialize();
            foreach (var image in _imageList.Images)
            {
                Image img = new Image() { Source = image.Source };
                img.Width = img.Height = 200;
                img.Margin = new Thickness(20, 0, 20, 0);
                img.ImageFailed += image_ImageFailed;
                img.PointerEntered += img_PointerEntered;
                img.PointerExited += img_PointerExited;
                sp_MainStackPanel.Children.Add(img);
            }
        }

Еще раз спасибо, ребята!

0 голосов
/ 06 марта 2012

Я думаю, что ваша проблема будет в этой строке.

FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);

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

FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read);
BitmapImage bitmapImage = new BitmapImage();

Возможно, что ссылка на bitmapImage переписана на вас.Однако, если это не поможет, вам может понадобиться метод .ContinueWith.

storageFile.OpenAsync(FileAccessMode.Read).ContinueWith(task => {
  FileRandomAccessStream stream = (FileRandomAccessStream)task.Result;
  BitmapImage bitmapImage = new BitmapImage();
  bitmapImage.SetSource(stream);
  Image image = new Image();
  image.Source = bitmapImage;
  Images.Add(image);
});
...