读取文件并同步返回(Metro App)

时间:2012-10-07 18:37:17

标签: asynchronous microsoft-metro

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

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

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

}

1 个答案:

答案 0 :(得分:1)

您尝试在完成之前获取异步操作的结果。我建议您阅读我的intro to async / await并跟进async / await FAQ

特别是你的构造函数:

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

ReadModelAsync完成之前返回。由于构造函数不能是异步的,我建议您使用异步工厂或我的博客中描述的asynchronous lazy initialization(也可以在我的AsyncEx library中找到)。

以下是使用异步工厂方法的简单示例:

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;
  }

  ...
}