当我遇到一个有趣的问题时,我正在将我的一个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的方法。我想尽可能动态地加载我的内容,所以我希望这是可行的。
答案 0 :(得分: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