异步反序列化调用不在C中工作#

问题描述:

我正在使用Newtonsoft.Json来读取json文件。我正在尝试对json文件进行aysnc调用以读取其数据,但不幸的是它没有返回任何内容。我想没有异步和它完美的作品,下面是我的代码:异步反序列化调用不在C中工作#

public static async Task<T> LoadAsync<T>(string filePath) 
{ 
     // filePath: any json file present locally on the disk 
     string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", ""); 
     string fullPath = Path.Combine(basePath, filePath); 
     using (var stream = File.OpenRead(fullPath)) 
     { 
      var reader = new StreamReader(stream, Encoding.GetEncoding("iso-8859-1")); 
      var task = Task.Factory.StartNew(() => JsonConvert.DeserializeObject<T>(reader.ReadToEnd())); 
      var value = await task; 
      return value; 
     } 
} 

我试图调试,但调试器在上述方法的“返回值”不来了,我用下面的函数调用上述方法:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 
} 

可能是什么问题?文件存在于我的电脑本地。

+5

如果你的'LoadAsync'方法是'async',那么你应该等待它。 (这又意味着'GetDataFromJson'应该是'async Task'而不是'void'。) – David

我试图让aysnc调用JSON文件中读取其数据

你真的想使代码异步? JsonUtilities课程是否提供LoadAsync()方法的同步版本?

你的方法是同步的:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 
} 

这不正是一件事情:它调用LoadAsync()。它确实将该方法的返回值存储在value中,但您从不使用value。所以它被忽略了。 LoadAsync()的返回值不是TaxOffice对象。这是Task,代表着LoadAsync()正在做的工作。在完成任务之前,没有办法获得价值。但是GetDataFromJson()不会等待任务完成。因此,如果调用者希望在方法返回的时候完成,它将非常失望。

如何最好地修复您的代码尚不清楚,因为您没有提供a good, minimal, complete code example显示您需要帮助。但是,有两个明显的策略,你可以遵循:

制作方法异步:

private async Task GetDataFromJson() 
{ 
     var value = await JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 

     // presumably you do something with "value" here? 
} 

这是最好的办法。但是它要求调用者能够正确处理异步调用。它可能也需要变成async方法。它的来电者。等等,直到你到达你的调用堆栈的顶部(例如事件处理程序方法)。

在整个调用堆栈中切换到async是件痛苦的事情,但是如果你这样做的话代码会更好。你的线程(可能是一个UI线程)不会卡在等待操作,你也将被设置为正确处理其他异步操作。

忽略LoadAsync()方法的异步特性:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE).Result; 

     // presumably you do something with "value" here? 
} 

这是不太好™方法。有用。但是它会阻止当前的线程,直到异步操作完成,否则首先会失去进行异步操作的全部好处。