【问题标题】:KnownFolders.GetFolderAsync never returns in .NET Core 5KnownFolders.GetFolderAsync 在 .NET Core 5 中永远不会返回
【发布时间】:2021-04-03 18:48:17
【问题描述】:

我正在使用Uno Platform 制作一个应用程序,该应用程序可以从游戏 (BeamNG.drive) 访问用户文档库中的特定文件夹。我希望应用程序读取此文件夹中的所有 mod 文件,以便能够在启动时对其进行编辑和显示给用户。我安装了 Nito.Mvvm.Async 包来帮助我将所有内容绑定到 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;
}

这是我的解决方案中 Shared 项目中 MainPage.xaml.cs 上的代码,基于来自 this answer 的代码

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

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

【问题讨论】:

  • @Dai "从 C# 9.0 开始,构造函数调用表达式是目标类型的。也就是说,如果表达式的目标类型已知,则可以省略类型名称" (new operator)

标签: c# .net-core uwp async-await uno-platform


【解决方案1】:

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

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

【讨论】:

  • 感谢您的澄清!我已经在我的清单中添加了该功能,但我不知道 Uno 不支持 KnownFolders。我的目标是制作一个与特定应用程序(来自名为 BeamNG.drive 的游戏中的文件夹)交互的 web 应用程序,它总是位于用户的文档库中。我可以使用文件夹选择器,但如果应用程序只是从该特定文件夹加载信息,它将非常用户友好。您知道可以在 Uno 平台应用程序中完成此操作的任何其他方式吗?
  • 应该可以在每个平台上检索文件夹,尽管是以特定于平台的方式(因为文件夹在每个平台上也有不同的位置和用途)。我建议使用特定于平台的代码并尝试以他的方式访问文件夹路径。在此处查看有关特定于平台的 C# 代码的文档 - platform.uno/docs/articles/platform-specific-csharp.html
猜你喜欢
  • 2019-11-15
  • 2011-07-25
  • 1970-01-01
  • 2012-10-02
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多