【问题标题】:Read a json file async vs 2017 .net core读取 json 文件 async vs 2017 .net core
【发布时间】:2018-06-09 14:49:52
【问题描述】:

我有一堆 json 文件需要阅读。 是否可以将此代码转换为完全异步? 有没有更好的方法来做到这一点?

public static T LoadJsonFile<T>(this Assembly assembly, string fullFilename) where T : new()
    {
        T result;

        Stream stream = assembly.GetManifestResourceStream(fullFilename);

        using (var reader = new StreamReader(stream))
        {
            result = JsonConvert.DeserializeObject<T>(reader.ReadToEnd());
        }
        return result;
    }

这不是重复的,因为我在问如何不使用 HTTPCLIENT 读取 json 文件

有样品吗?

谢谢

【问题讨论】:

  • @tura08 你指出的问题是关于 HttpClient 。我的没有 Httpclient 参与
  • 通过 HTTP 或 Stream 访问是无关紧要的。正如他们在问题中所说,他们有兴趣使这条线异步:List_ = JsonConvert.DeserializeObject&lt;List&lt;MyObject&gt;&gt;(response.Content);。如您所见,答案是将其包装在Task.Run 中并等待它。您还可以使用ReadToEndAsync() 异步读取您的流。
  • okish.. 你知道 Task.Run 将在线程池上创建一个线程而不是异步.. 你是说我可以更改为 ReadToEndAsync 但随后被 Task.Run 阻止将同步运行。我错了吗?
  • 解决方案细节很重要,因为@DaisyShipton 试图确定这是否是 XY 问题。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem

标签: c# async-await json.net


【解决方案1】:

您可以使用ReadToEndAsync 使 IO 潜在地异步:

public static async Task<T> LoadJsonFile<T>(this Assembly assembly, string fullFilename)
    where T : new()
{
    using (var stream = assembly.GetManifestResourceStream(fullFilename))
    {
        using (var reader = new StreamReader(stream))
        {
            string json = await reader.ReadToEndAsync();
            return JsonConvert.DeserializeObject<T>(json);
        }
    }
}

但是,对此有一些注意事项:

  • JSON 解析和反序列化仍在同步执行。您可能会发现自己受 CPU 限制而不是 IO 限制。
  • 并非所有流都可以执行真正的异步 IO。不知道GetManifestResourceStream返回的那个能不能。您可能会发现它最终以一种对您没有多大帮助的方式“伪造”异步。
  • 如果您尝试加载数千个文件,则很可能最终会出现磁盘争用。 (这将取决于许多因素,包括它是什么类型的磁盘、嵌入式资源的处理方式以及文件与资源的组合。)

我至少会尝试一个简单的Parallel.ForEach 循环以及异步,看看它与异步代码相比如何。确保您有一个测试性能的好方法和验收标准,以便您知道何时完成。

【讨论】:

  • 。感谢您抽出宝贵时间回答我的问题。我将明确地比较并行与异步,因为它不像你指出的那样干净利落。
猜你喜欢
  • 2019-07-21
  • 2023-03-12
  • 1970-01-01
  • 2019-01-26
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2018-01-08
相关资源
最近更新 更多