【问题标题】:Async method does not recognize yield return method? [duplicate]异步方法不识别产量返回方法? [复制]
【发布时间】:2019-10-25 14:53:40
【问题描述】:

问题

当我尝试在异步方法中调用我的“正常”方法时,它会被 Debugger1 忽略。

这是我的异步方法

 internal async static Task<DefinitionsModel> DeserializeAsync(this string path)
 {
        var model = new DefinitionsModel();
        var content = await File.ReadAllTextAsync(path);

        model.Pages = content.GetPages();

        return model;
 }

这是我的“正常”方法

private static IEnumerable<PageModel> GetPages(this string content)
{            
        var level = 0;
        var value = nameof(PageModel.Page).GetDElement<PageModel>();
        var start_with_line = $"{level} {value} ";
        var end_with_line = string.Concat(Enumerable.Repeat(Environment.NewLine, 2));

        var expression = $@"\b{start_with_line}\S * {end_with_line}\b";
        var matches = content.GetPagesFromContent(expression);


        yield return new PageModel();
}

帮助图片

【问题讨论】:

  • 那可能是因为您的 IEnumerable&lt;T&gt; 结果没有被迭代/持久化。例如,您的方法在用于 foreach 循环时执行。
  • @phuzi 我的问题不在于 List vs IEnumeable ....
  • 拥有一个带有单个yield 语句的方法真的很奇怪,为什么不只返回一个PageModel
  • 我同意标题具有误导性,但其中的解释实际上非常有用。 @OverZer0
  • @DavidG 我的方法还没用完,我只想看看“数学集合”有哪些值

标签: c# yield


【解决方案1】:

yield 除非被枚举,否则不会产生。在这种情况下:

model.Pages = content.GetPages();

没有枚举。但是你可以这样做:

model.Pages = content.GetPages().ToList();

您通过使用 foreach 语句或 LINQ 查询来使用迭代器方法,不出所料,ToList() 使用 foreach 迭代 IEnumerable

老实说,我很难弄清楚你在做什么,很可能需要重新考虑GetPages

yield (C# Reference)

当您在语句中使用 yield 上下文关键字时,您表示 它出现的方法、运算符或 get 访问器是 迭代器。使用yield 定义迭代器消除了对 显式的额外类(保存状态的类 枚举,请参阅 IEnumerator 示例)当您实现 用于自定义集合类型的 IEnumerable 和 IEnumerator 模式。

您使用 yield return 语句一次返回每个元素。

您通过使用 foreach 语句或 LINQ 来使用迭代器方法 询问。 foreach 循环的每次迭代都会调用迭代器方法。 当迭代器方法中到达一个 yield return 语句时, 返回表达式,并保留代码中的当前位置。 下一次该位置重新开始执行 迭代器函数被调用。

【讨论】:

    【解决方案2】:

    您的GetPages 方法返回一个IEnumerable&lt;T&gt;yield return。编译器根据该代码构建状态机。

    只有在使用GetEnumerator() 方法从生成的状态机获得的枚举器被调用和迭代时,该代码才会被执行。

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 2014-09-22
      • 2012-09-05
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2012-12-20
      相关资源
      最近更新 更多