C# GetFileAsync冻结应用程序并不会引发异常
我正在尝试读取具有以下内容的文件:C# GetFileAsync冻结应用程序并不会引发异常,c#,async-await,uwp,C#,Async Await,Uwp,我正在尝试读取具有以下内容的文件: public static async Task<JsonObject> read(string nome) { nome = GetSafeFilename(nome); string json = ""; try { StorageFolder folder = ApplicationData.Current.LocalFolder; Debug.Write
public static async Task<JsonObject> read(string nome)
{
nome = GetSafeFilename(nome);
string json = "";
try
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
Debug.WriteLine("here? folder");
StorageFile jsonFile = await folder.GetFileAsync(nome);
Debug.WriteLine("here? file");
json = await FileIO.ReadTextAsync(jsonFile);
Debug.WriteLine("here? fileio" + json);
}
catch ( Exception ex )
{
Debug.WriteLine(ex.StackTrace);
}
return JsonObject.Parse(json); //converte string para jsonobject
}
公共静态异步任务读取(字符串nome)
{
nome=GetSafeFilename(nome);
字符串json=“”;
尝试
{
StorageFolder folder=ApplicationData.Current.LocalFolder;
Debug.WriteLine(“此处?文件夹”);
StorageFile jsonFile=await folder.GetFileAsync(nome);
Debug.WriteLine(“此处?文件”);
json=await FileIO.ReadTextAsync(jsonFile);
WriteLine(“这里?fileio”+json);
}
捕获(例外情况除外)
{
Debug.WriteLine(例如StackTrace);
}
返回JsonObject.Parse(json);//转换字符串para JsonObject
}
但该应用程序冻结应用程序,不会抛出任何例外。
“Console.Writeline”在“here?file”中停止
我做错了什么吗?您的代码看起来很好,因此调用“read”方法的方法很可能存在问题。您是否正在同步调用它,例如“read(myfile.json).Result?如果是这样,您很可能会遇到死锁 下面是关于这个问题的一些讨论: 最好的解决方案是确保您没有尝试将异步调用与同步调用混合使用
我必须检索一个id绑定的对象的信息。我做了一些事情:arr=MyFile.getArray(filename.Result);其中有…JsonObject json=await read(filename) 这就是你的应用程序冻结的原因,当你调用
Task.Result
时,它实际上会死锁
相反,您需要使整个调用链也异步。这意味着无论哪个代码调用read
,它本身都应该是异步的,并返回一个任务
:
public async Task ReadJsonAsync()
{
var jsonObject = await MyFile.ReadAsync("foo");
}
注C#方法的命名约定为pascal大小写,异步方法应添加“async”“postfix.关键字async
应该在static
.ops之后。我的错误,但不是一个解决方案。如果这是真的,它就不会被编译。我必须检索一个id绑定的对象的信息。我做了someArr=MyFile.getArray(filename.Result)代码>并且里面有。。。JsonObject json=等待读取(文件名)代码>。你能给我一个从文件中检索数据的其他方法吗?谢谢你的建议。我将该方法更改为静态异步public void getArr(MyObject my)
,并在异步方法中进行赋值。这很有效,但我不知道这是否是一种好的技术。@vinicius不知道这意味着什么