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不知道这意味着什么