1

我正在写一个地铁应用程序。我正在尝试读取文件并从数据中返回一个 float[]。但无论我做什么,该函数似乎都返回null。我已经尝试过类似问题的解决方案,但没有运气。

例如,如果我使用:
float[] floatArray = new ModelReader("filename.txt").ReadModel()
结果将是一个空数组。

但是,如果我使用:
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

您试图在异步操作完成之前获得它的结果。我建议您阅读我的介绍async/await并跟进async/ 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 回答