0

当我遇到一个有趣的问题时,我正在将我的一个 XNA 项目移植到 Monogame 中。由于作为 Windows 8 用户,我的应用程序是沙盒的,因此我不能使用我习惯使用的 Directory.GetFiles 方法来提取内容目录中的文件列表。我的目标是获取内容目录中的文件列表,例如 (myappinstalllocation\Content\TypeofContent\XmlFiles)。

在 Xna 我会使用:

string[] skillFiles = Directory.GetFiles(path, "*.xml");

我从 msdn 尝试了以下代码,但异步方法有时会在几分钟内无法返回,有时根本不会:

string[] fileNames = SystemIO.getFileNames(path, "xml").Result;

public static async Task<string[]> getFileNames(string pPath, string pExt)
    {
        List<string> results = new List<string>();
        StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(pPath);

        IReadOnlyList<StorageFile> contents = await folder.GetFilesAsync();

        foreach (StorageFile file in contents)
        {
            if (file.FileType.Contains(pExt))
            {
                results.Add(file.Name);
            }
        }

        return results.ToArray();
    }

我不知道 MonoGame 是否提供了一种获取文件名的方法,或者 WinStore API 是否提供。我想尽可能多地动态加载我的内容,所以我希望这是可行的。

4

1 回答 1

4

我认为你所看到的是一个僵局。在 UI 线程上使用Task.Result可以做到这一点。尝试await改用:

string[] fileNames = await SystemIO.getFileNames(path, "xml");

await是非阻塞的,并允许 UI 线程在您的调用getFileNames完成时执行其他操作。

查看 Stephen Cleary 关于该主题的优秀博客文章:http: //blog.stephencleary.com/2012/07/dont-block-on-async-code.html

于 2013-03-04T02:30:43.030 回答