首页 > 解决方案 > KnownFolders.GetFolderAsync 在 .NET Core 5 中永远不会返回

问题描述

我正在使用Uno Platform制作一个应用程序,该应用程序可以从游戏 (BeamNG.drive) 访问用户文档库中的特定文件夹。我希望该应用程序能够读取此文件夹中的所有 mod 文件,以便能够在启动时对其进行编辑并向用户显示它们。我安装了Nito.Mvvm.AsyncPackage 以帮助我将所有内容绑定到 UI。

这是从 Documents 文件夹加载 mod 文件的方法的一部分:

public static async Task<List<Mod>> GetModList()
{
    StorageFolder documents = await KnownFolders.DocumentsLibrary.GetFolderAsync("BeamNG.drive");
    IReadOnlyList<StorageFile> fileList = await documents.GetFilesAsync();

    List<Mod> foundModsList = new();
    
    foreach (StorageFile file in fileList)
    {
        //...
    }

    return foundModsList;
}

这是我的解决方案中项目MainPage.xaml.cs内部的代码Shared,基于此答案中的代码

public NotifyTask<ObservableCollection<Mod>> ModsData { get; }

public MainPage()
{
    InitializeComponent();
    ModsData = NotifyTask.Create(InitModData());
}

private static async Task<ObservableCollection<Mod>> InitModData()
{
    return new(await ModManager.GetModList());
}

GetModList()方法被调用,但该GetFolderAsync("BeamNG.drive")方法永远不会返回,并且应用程序继续正常运行(不是 UI 冻结或任何事情)。如果我在该行中添加断点,Visual Studio 会正常停在那里。但是,如果我按“Step Over”,VS 不会继续使用该方法,而是跳到这一行......

return new(await ModManager.GetModList());

...然后这个:

ModsData = NotifyTask.Create(InitModData());

ConfigureAwait(false)在任何调用中使用 using都await无济于事。我真的不确定发生了什么,我怀疑这Nito.Mvvm.Async可能与它有关(考虑到它的最后一次更新是在 2017 年)但我真的不确定。

标签: c#.net-coreuwpasync-awaituno-platform

解决方案


从您的问题来看,这个问题似乎发生在 .NET 5 下——这意味着针对 Uno Platform 的 WebAssembly 或 Skia 目标。在 Uno 下,KnownFolders尚不支持该类型,因此DocumentLibrary无法访问。如果您想获得此支持,请在Uno Platform GitHub 上提交问题。

对于 UWP,要访问 Documents 库,您需要在应用清单中声明一个特殊功能(请参阅Docs)。但是,这是一项受限功能,如果您使用它,该应用很可能无法通过 Microsoft Store 认证。相反,建议FolderPicker改用并让用户决定存储文件的位置,或者ApplicationData.Current.LocalFolder用于私下存储应用程序的数据。


推荐阅读