0

我正在 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() 还是我可能的其他事情失踪。

提前致谢 :)

4

3 回答 3

1

我猜这只是一个时间问题,但是在 foreach 中做一个断点或跟踪点肯定会说明问题。

尝试将其更改为返回任务,然后在调用者中等待它可以

于 2012-03-05T18:32:48.407 回答
0

好的,感谢你们,我找到了解决方案,我不得不重新排列代码,

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);
            }
        }

再次感谢伙计们!

于 2012-03-06T14:14:28.413 回答
0

我认为你的问题将是这条线。

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);
});
于 2012-03-06T10:55:03.370 回答