c# - KnownFolders.GetFolderAsync 在 .NET Core 5 中永远不会返回
问题描述
我正在使用Uno Platform制作一个应用程序,该应用程序可以从游戏 (BeamNG.drive) 访问用户文档库中的特定文件夹。我希望该应用程序能够读取此文件夹中的所有 mod 文件,以便能够在启动时对其进行编辑并向用户显示它们。我安装了Nito.Mvvm.Async
Package 以帮助我将所有内容绑定到 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 年)但我真的不确定。
解决方案
从您的问题来看,这个问题似乎发生在 .NET 5 下——这意味着针对 Uno Platform 的 WebAssembly 或 Skia 目标。在 Uno 下,KnownFolders
尚不支持该类型,因此DocumentLibrary
无法访问。如果您想获得此支持,请在Uno Platform GitHub 上提交问题。
对于 UWP,要访问 Documents 库,您需要在应用清单中声明一个特殊功能(请参阅Docs)。但是,这是一项受限功能,如果您使用它,该应用很可能无法通过 Microsoft Store 认证。相反,建议FolderPicker
改用并让用户决定存储文件的位置,或者ApplicationData.Current.LocalFolder
用于私下存储应用程序的数据。
推荐阅读
- gradle - 我如何使用 gradle 调试 intelij tomcat
- f# - 获取 F# 中布尔数组中特定位置的索引值
- css - 如何将标题表与表响应(不是javascript)粘贴在一起?
- sql - 使用存在或不存在查找唯一的名称
- python - python:反转影响运算符的魔术方法的元素
- java - WebObjects 图像缓存
- android - Huawei Android AppUpdateClient - 如何测试
- c++ - C++:检查文件是否正在运行
- c# - ASP.Net API DateTime ISO8601 日期值在生产和 Azure 中被解析为默认日期 (01/01/0001 00:00:00)
- ansible - Ansible 递归授予对文件的只读访问权限