我正在使用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;
}
}
我尝试调试但调试器没有启动&#34;返回值&#34;在上面的方法中我通过以下函数调用上面的方法:
private void GetDataFromJson()
{
var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE);
}
可能是什么问题?文件存在于我的计算机本地。
答案 0 :(得分:2)
我正在尝试对json文件进行aysnc调用以读取其数据
你真的想异步制作代码吗? 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?
}
这是Not Very Good™方法。有用。但它会阻止你的当前线程,直到完成异步操作,否定了首先进行异步操作的全部好处。