C# 异步Json.net反序列化

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

正如it(great blog,顺便说一句)所示,要正确处理CPU绑定的调用,需要正确的异步调用。例如,不是

    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绑定方法包装成异步方法,例如for
JsonConvert.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;
}