异步方法不识别收益率返回方法?

时间:2019-06-11 08:21:45

标签: c# yield

问题

当我尝试在async方法中调用“普通”方法时,则会从Debugger 1中忽略它。

这是我的异步方法

 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();
}

帮助图片

image link

2 个答案:

答案 0 :(得分:7)

除非枚举,否则

yield不会产生。在这种情况下

model.Pages = content.GetPages();

没有枚举。但是,您可以这样做

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

您通过使用foreach语句或LINQ查询来消耗迭代器方法,并且毫无疑问,ToList()使用IEnumerable来迭代foreach

尽管坦率地说,我正在努力弄清自己在做什么,但很可能需要重新考虑GetPages

yield (C# Reference)

  

在语句中使用yield上下文关键字时,表示   出现在其中的方法,运算符或获取访问器是   迭代器。使用yield定义迭代器可以消除对   显式的额外类(包含状态的类   枚举,请参见IEnumerator的示例)   自定义集合类型的IEnumerable和IEnumerator模式。

     

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

     

使用foreach语句或LINQ消耗迭代器方法   查询。 foreach循环的每次迭代都调用iterator方法。   当在迭代器方法中达到yield return语句时,   返回表达式,并保留代码中的当前位置。   下次下次从该位置重新开始执行   迭代器函数被调用。

答案 1 :(得分:1)

您的GetPages方法返回带有IEnumerable<T>的{​​{1}}。编译器从该代码构建状态机。

仅当调用并迭代从生成的状态机使用yield return方法获得的枚举数时,该代码才会执行​​。