C# 异步Json.net反序列化
正如it(great blog,顺便说一句)所示,要正确处理CPU绑定的调用,需要正确的异步调用。例如,不是C# 异步Json.net反序列化,c#,json,windows-phone-7,asynchronous,json.net,C#,Json,Windows Phone 7,Asynchronous,Json.net,正如it(great blog,顺便说一句)所示,要正确处理CPU绑定的调用,需要正确的异步调用。例如,不是 await Task.Run(() => Thread.Sleep(100)); 但是 有类似的Json.net反序列化吗 await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProduct>(resultString)); wait TaskEx.Run(()=>JsonConv
await Task.Run(() => Thread.Sleep(100));
但是
有类似的Json.net反序列化吗
await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProduct>(resultString));
wait TaskEx.Run(()=>JsonConvert.DeserializeObject(resultString));
用法的上下文:
async public Task<ProductsAnswer> RequestServerAsync()
{
// Just a wrapper for await httpWebRequest.GetResponseAsync() and await postStreamReader.ReadToEndAsync()
var resultString = await new NetworkManager().GetAsync(Constants.SERVER_REQUEST);
// await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProduct>(resultString));
var answer = await ParseProductsFromString(resultString);
return answer;
}
异步公共任务RequestServerAsync()
{
//只是wait httpWebRequest.GetResponseAsync()和wait postStreamReader.ReadToEndAsync()的包装
var resultString=wait new NetworkManager().GetAsync(Constants.SERVER\u请求);
//等待TaskEx.Run(()=>JsonConvert.DeserializeObject(resultString));
var answer=await ParseProductsFromString(resultString);
返回答案;
}
这篇博文的重点是避免阻塞对不受CPU限制的操作的调用,例如延迟或磁盘/网络IO
解析JSON是一种固有的CPU限制操作;您最好将该工作移到其他线程。但TaskEx.Run()是否在后台线程中安排并运行Func?@vitalivasylenko:是的。有趣的是,Json.NET做的正是Stephen Cleary认为不应该做的事情。它通过使用
Task.Factory.StartNew
将其同步CPU绑定方法包装成异步方法,例如forJsonConvert.DeserializeObjectAsync
@TrevorElliott:See还@SLaks不清楚您是否暗示“请参见此处,了解Json.NET为什么以这种方式编写是合理的”或“看看这里为什么不应该这样。”但我绝对不认为应该这样,因为它没有遵循基类/接口,也没有将自己作为基类。
async public Task<ProductsAnswer> RequestServerAsync()
{
// Just a wrapper for await httpWebRequest.GetResponseAsync() and await postStreamReader.ReadToEndAsync()
var resultString = await new NetworkManager().GetAsync(Constants.SERVER_REQUEST);
// await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProduct>(resultString));
var answer = await ParseProductsFromString(resultString);
return answer;
}