我正在使用Newtonsoft.Json读取Json文件。我正试图对json文件进行aysnc调用以读取其数据,但不幸的是,它没有返回任何内容。我尝试过不使用异步,它运行得很好,下面是我的代码:
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);
}
问题出在哪里?文件在我的计算机上本地存在。
我正在尝试对json文件进行aysnc调用,以读取其数据
你真的想异步生成代码吗?JsonUtilities
类是否提供LoadAsync()
方法的同步版本?
您的方法是同步的:
private void GetDataFromJson()
{
var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE);
}
它只做一件事:它调用LoadAsync()
。它确实将该方法的返回值存储在value
中,但您永远不会使用value
。所以它被忽略了。LoadAsync()
的返回值不是TaxOffice
对象。它是一个Task
,代表LoadAsync()
正在做的工作。在完成该任务之前,无法获得值。但是GetDataFromJson()
并不等待任务完成。因此,如果调用者希望在方法返回时完成,那么它会非常失望。
如何最好地修复您的代码尚不清楚,因为您还没有提供一个好的最小、完整代码示例来显示您需要帮助的内容。但有两种明显的策略可以遵循:
使方法异步:
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?
}
这是不太好™方法它有效。但是它会阻塞当前线程,直到异步操作完成,从而否定了异步操作的全部好处。