UWP C# 异步方法等待数据未完全加载异常

本文关键字:加载 异常 数据 异步方法 等待 UWP | 更新日期: 2023-09-27 18:37:01

我会尽量用简单的话来讲述我的问题。在我的 UWP 应用中,我正在我的主页上异步加载数据.xaml.cs'

public MainPage()
{
    this.InitializeComponent();
    LoadVideoLibrary();
}
private async void LoadVideoLibrary()
{
    FoldersData = new List<FolderData>();
    var folders = (await Windows.Storage.StorageLibrary.GetLibraryAsync
                   (Windows.Storage.KnownLibraryId.Videos)).Folders;
    foreach (var folder in folders)
    {
        var files = (await   folder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByDate)).ToList();
        FoldersData.Add(new FolderData { files = files, foldername = folder.DisplayName, folderid = folder.FolderRelativeId });
    }
    }

所以这是我加载文件夹数据对象列表的代码。在我的另一个页面 Library.xaml 中.cs我正在使用该数据使用绑定数据加载我的网格视图。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        try
        {
            LoadLibraryMenuGrid();
        }
        catch { }
    }
    private async void LoadLibraryMenuGrid()
    {
        MenuGridItems = new ObservableCollection<MenuItemModel>();
        var data = MainPage.FoldersData;
        foreach (var folder in data)
        {
            var image = new BitmapImage();
            if (folder.files.Count == 0)
            {
                image.UriSource = new Uri("ms-appx:///Assets/StoreLogo.png");
            }
            else
            {
                for (int i = 0; i < folder.files.Count; i++)
                {
                    var thumb = (await folder.files[i].GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.VideosView));
                    if (thumb != null) { await image.SetSourceAsync(thumb); break; }
                }
            }
            MenuGridItems.Add(new MenuItemModel
            {
                numberofvideos = folder.files.Count.ToString(),
                folder = folder.foldername,
                folderid = folder.folderid,
                image = image
            });
        }
        GridHeader = "Library";
    }

我面临的问题是,当我启动我的应用程序时,等待几秒钟,然后导航到我的库页面,所有数据都会正确加载。

但是当我尝试在启动应用程序后立即导航到库页面时,它给出了一个例外

"集合已修改,因此无法迭代"

使用了断点,我开始知道如果我给它几秒钟,列表文件夹数据已经异步正确加载,但是当我不给它几秒钟时,该异步方法在加载数据的一半时,它会导致异常,我如何处理这种异步情况?

UWP C# 异步方法等待数据未完全加载异常

谢谢

您需要的是一种等待数据到达的方法。如何将其与应用程序的其余部分(例如 MVVM 与否)相适应是另一回事,现在并不重要。不要把事情复杂化。例如,仅当您希望数据在用户查看数据时发生更改时,才需要 ObservableCollection。

无论如何,你需要等待。那么,您如何等待这些数据到达呢?

使用可从任何位置访问的静态类。在那里放了一个方法来获取你的数据。确保它返回您缓存的任务以供将来调用。例如:

internal class Data { /* whatever */ }
internal static class DataLoader
{
    private static Task<Data> loaderTask;
    public static Task<Data> LoadDataAsync(bool refresh = false)
    {
        if (refresh || loaderTask == null)
        {
            loaderTask = LoadDataCoreAsync();
        }
        return loaderTask;
    }
    private static async Task<Data> LoadDataCoreAsync()
    {
        // your actual logic goes here
    }
}

这样,您可以在启动应用程序后立即开始下载。

await DataLoader.LoadDataAsync();

当您需要其他屏幕中的数据时,只需再次调用该方法即可。它不会再次下载数据(除非您将刷新设置为 true),而只是等待您之前开始的工作完成(如果尚未完成)。

我知道你没有足够的经验。加载数据的方式存在多个问题,并且没有解决方案。

您需要的是一个可以为您提供文件夹数据的可观察集合的服务。我认为 MVVM 在这种情况下可能超出了界限,除非您愿意花几个小时。尽管在这种情况下,MVVM 将使事情变得容易得多。

手头的主要问题是这个您正在使用 foreach 循环访问文件夹和文件夹数据列表。如果基础集合发生更改,则 Foreach 无法继续。

首先,您需要开始使用 for 循环而不是 foreach。 2nd添加一个表示加载是否已完成的状态。最后使用可观察数据源。在我早期,我曾经在 App.xaml 中创建静态属性.cs并且我曾经使用它们来共享/观察其他数据。