异步Json.net反序列化

4

这个网站所述(顺带一提,这是一个很棒的博客),为了让CPU密集型调用正确工作,需要使用合适的异步调用。例如,不要使用

    await Task.Run(() => Thread.Sleep(100));

但是
    await Task.Delay(100);

有没有类似于Json.net反序列化的东西?
    await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProduct>(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;
}
1个回答

5
那篇博客的重点是避免阻塞那些不属于CPU密集型操作的调用,例如延迟或磁盘/网络IO。解析JSON是一种本质上需要CPU计算的操作;最好的方法是将该工作移动到不同的线程中进行。

但是 TaskEx.Run() 不是在后台线程中安排和运行 Func 吗? - Vitalii Vasylenko
1
@VitaliiVasylenko:是的。那就是你能做的最好的了。 - SLaks
1
@TrevorElliott:另请参阅http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx - SLaks
1
@SLaks,你的意思不太清楚,是在暗示“看这里为什么Json.NET应该那样写”,还是“看这里为什么它不应该那样写”。但我绝对认为它不应该那样写,因为它没有遵循基类/接口或作为基类自身行动。 - Trevor Elliott
后者。 - SLaks
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接