0

興味深い問題に遭遇したとき、XNA プロジェクトの 1 つを 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

あなたが見ているのはデッドロックだと思います。Task.ResultUIスレッドで使用すると、それが行われます。await代わりに使用してみてください:

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

awaitはノンブロッキングであり、呼び出しgetFileNamesが完了している間、UI スレッドが他のことを実行できるようにします。

この件に関する Stephen Cleary の優れたブログ記事をチェックしてください: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

于 2013-03-04T02:30:43.030 に答える