异步反序列化调用不在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);
}
可能是什么问题?文件存在于我的电脑本地。
我试图让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?
}
这是不太好™方法。有用。但是它会阻止当前的线程,直到异步操作完成,否则首先会失去进行异步操作的全部好处。
如果你的'LoadAsync'方法是'async',那么你应该等待它。 (这又意味着'GetDataFromJson'应该是'async Task'而不是'void'。) – David