1

私はメトロアプリを書いています。ファイルを読み取って、データからfloat[]を返そうとしています。しかし、私が何をしても、関数はnullを返すようです。私は運が悪かったのと同じような質問の解決策を試しました。

たとえば、次のように使用します
。float [] floatArray = new ModelReader( "filename.txt")。ReadModel()
結果はnull配列になります。

ただし、次を使用する場合:
new ModelReader( "filename.txt")
"Test"も配列を返す前に出力するため、正しい配列がコンソールに出力されます。これは私には非常に奇妙に思えます。

ガイダンスをお願いします。何が悪いのかわかりません。

public class ModelReader
{
    float[] array;

    public ModelReader(String name)
    {
        ReadModelAsync(name);
    }

    public float[] ReadModel()
    {
        return array;
    }

    private async Task ReadModelAsync(String name)
    {
        await readFile(name);
    }

    async Task readFile(String name)
    {
        // settings
        var path = @"Assets\models\" + name;
        var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

        // acquire file
        var file = await folder.GetFileAsync(path);

        // read content
        var read = await Windows.Storage.FileIO.ReadTextAsync(file);
        using (StringReader sr = new StringReader(read))
        {
            Test test = new Test(getFloatArray(sr));
            this.array = test.printArray();
        }
    }

    private float[] getFloatArray(StringReader sr) { ... }


public class Test
{
    public float[] floatArray;

    public Test(float[] floatArray) 
    {
        this.floatArray = floatArray;
    }


    public float[] printArray()
    {
        for (int i = 0; i < floatArray.Length; i++)
        {
            Debug.WriteLine(floatArray[i]);
        }

        return floatArray;
    }

}
4

1 に答える 1

1

非同期操作が完了する前に、その結​​果を取得しようとしています。/の紹介と、 asyncawaitasync/ awaitFAQのフォローアップを読むことをお勧めします。

特に、コンストラクターは次のとおりです。

public ModelReader(String name)
{
  ReadModelAsync(name);
}

ReadModelAsyncが完了する前に戻っています。コンストラクターを非同期にすることはできないため、ブログ(AsyncExライブラリでも利用可能)で説明されているように、非同期ファクトリまたは非同期レイジー初期化を使用することをお勧めします。

非同期ファクトリアプローチを使用した簡単な例を次に示します。

public class ModelReader
{
  float[] array;

  private ModelReader()
  {
  }

  public static async Task<ModelReader> Create(string name)
  {
    var ret = new ModelReader();
    await ret.ReadModelAsync(name);
    return ret;
  }

  ...
}
于 2012-10-08T00:36:33.960 に答える