问题
当我尝试在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();
}
帮助图片
答案 0 :(得分:7)
yield
不会产生。在这种情况下
model.Pages = content.GetPages();
没有枚举。但是,您可以这样做
model.Pages = content.GetPages().ToList();
您通过使用foreach
语句或LINQ查询来消耗迭代器方法,并且毫无疑问,ToList()
使用IEnumerable
来迭代foreach
尽管坦率地说,我正在努力弄清自己在做什么,但很可能需要重新考虑GetPages
在语句中使用
yield
上下文关键字时,表示 出现在其中的方法,运算符或获取访问器是 迭代器。使用yield
定义迭代器可以消除对 显式的额外类(包含状态的类 枚举,请参见IEnumerator的示例) 自定义集合类型的IEnumerable和IEnumerator模式。您使用yield return语句一次返回每个元素。
使用foreach语句或LINQ消耗迭代器方法 查询。 foreach循环的每次迭代都调用iterator方法。 当在迭代器方法中达到yield return语句时, 返回表达式,并保留代码中的当前位置。 下次下次从该位置重新开始执行 迭代器函数被调用。
答案 1 :(得分:1)
您的GetPages
方法返回带有IEnumerable<T>
的{{1}}。编译器从该代码构建状态机。
仅当调用并迭代从生成的状态机使用yield return
方法获得的枚举数时,该代码才会执行。