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