Asynchronous 读取文件并同步返回(Metro应用程序)

Asynchronous 读取文件并同步返回(Metro应用程序),asynchronous,microsoft-metro,Asynchronous,Microsoft Metro,我正在写一个地铁应用程序。 我试图读取一个文件并从数据中返回一个float[]。但无论我做什么,函数似乎都返回null。我尝试过解决类似问题的方法,但都没有成功 例如,如果我使用: float[]floatArray=新的ModelReader(“filename.txt”).ReadModel() 结果将是一个空数组 但是如果我使用: 新建ModelReader(“filename.txt”) 正确的数组将被打印到控制台,因为“Test”在返回数组之前也会打印数组。我觉得这很奇怪 请给我一些指

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

例如,如果我使用:
float[]floatArray=新的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;
    }

}
公共类ModelReader
{
浮点[]数组;
公共模型读取器(字符串名称)
{
ReadModelAsync(名称);
}
公共浮点[]ReadModel()
{
返回数组;
}
专用异步任务ReadModelAsync(字符串名称)
{
等待读取文件(名称);
}
异步任务读取文件(字符串名称)
{
//背景
变量路径=@“资产\模型\”+名称;
var folder=Windows.ApplicationModel.Package.Current.InstalledLocation;
//获取文件
var file=await folder.GetFileAsync(路径);
//阅读内容
var read=wait Windows.Storage.FileIO.ReadTextAsync(文件);
使用(StringReader sr=新StringReader(读取))
{
测试=新测试(getFloatArray(sr));
this.array=test.printary();
}
}
私有浮点[]getFloatArray(StringReader sr){…}
公开课考试
{
公共浮点数[]浮点数数组;
公共测试(浮点[]浮点数组)
{
this.floatArray=floatArray;
}
公共浮点[]打印数组()
{
for(int i=0;i
您正在尝试在异步操作完成之前获取其结果。我建议您阅读我的,并跟进

特别是,您的构造函数:

public ModelReader(String name)
{
  ReadModelAsync(name);
}
readmodelsync
完成之前返回。由于构造函数不能是异步的,我建议您使用异步工厂,或如我的博客(也可在my中获得)中所述

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

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

  ...
}
公共类ModelReader
{
浮点[]数组;
私有ModelReader()
{
}
公共静态异步任务创建(字符串名称)
{
var ret=新的ModelReader();
wait ret.readmodelsync(名称);
返回ret;
}
...
}

您正在尝试在异步操作完成之前获取其结果。我建议您阅读我的,并跟进

特别是,您的构造函数:

public ModelReader(String name)
{
  ReadModelAsync(name);
}
readmodelsync
完成之前返回。由于构造函数不能是异步的,我建议您使用异步工厂,或如我的博客(也可在my中获得)中所述

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

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

  ...
}
公共类ModelReader
{
浮点[]数组;
私有ModelReader()
{
}
公共静态异步任务创建(字符串名称)
{
var ret=新的ModelReader();
wait ret.readmodelsync(名称);
返回ret;
}
...
}

谢谢Stephen Cleary。我尝试了您的异步工厂方法,取得了一些成功,但后来我被困在了“ReadTextAsync”上。我相信这是一个死锁。我最终删除了所有等待并使用了“AsTask().Result”。正如我在我的博客上解释的那样,只要使用,就不应该有任何死锁问题。谢谢Stephen Cleary。我尝试了异步工厂方法,取得了一些成功,但后来我被困在了“ReadTextAsync”上。我相信这是一个死锁。我最终删除了所有等待并使用了“AsTask().Result”.正如我在博客上解释的那样,只要使用,就不应该有任何死锁问题。