所以,我有以下代码:
static void Main(string[] args)
{
var test1 = GeneratedHelperSync();
var test2 = GeneratedHelperAsync().Result;
}
[System.Diagnostics.DebuggerNonUserCode]
static int GeneratedHelperSync()
{
return RealCode();
}
[System.Diagnostics.DebuggerNonUserCode]
async static Task<int> GeneratedHelperAsync()
{
// F11 steps in here!
return await Task.FromResult(RealCode());
}
private static int RealCode()
{
return 1;
}
我是F11(逐步进入)Visual Studio 2013中的所有语句。 我希望在Main()的两次调用中都能让我进入&#34;返回1&#34;声明。 但是,在第二种情况下,它会引导我进入异步函数。
似乎编译器在异步代码生成期间删除了我的DebuggerNonUserCode 我的问题是,为什么这样做?我错过了什么吗?
至于为什么我想要这个,我有一些自动生成的辅助异步函数,我想避免一直踩到它们。
答案 0 :(得分:3)
这是一个常见的问题&#34;使用async
/ await
模式。添加到async
方法的所有属性都会发生这种情况(我在ExcludeFromCodeCoverageAttribute
发生了这种情况并对其进行了一些研究)。
发生的事情是,编译器将方法拆分为await
并将所有内容放在await
&#34;之后。进入一个新方法,在await
任务完成时调用。这个新方法没有从初始方法中获取属性 - 为什么我不知道。
我知道ExcludeFromCodeCoverageAttribute
的唯一方法就是在类级别设置属性。