DebuggerNonUserCode不适用于async / await

时间:2014-05-05 13:22:26

标签: c# visual-studio attributes async-await

所以,我有以下代码:

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 我的问题是,为什么这样做?我错过了什么吗?

至于为什么我想要这个,我有一些自动生成的辅助异步函数,我想避免一直踩到它们。

1 个答案:

答案 0 :(得分:3)

这是一个常见的问题&#34;使用async / await模式。添加到async方法的所有属性都会发生这种情况(我在ExcludeFromCodeCoverageAttribute发生了这种情况并对其进行了一些研究)。

发生的事情是,编译器将方法拆分为await并将所有内容放在await&#34;之后。进入一个新方法,在await任务完成时调用。这个新方法没有从初始方法中获取属性 - 为什么我不知道。

我知道ExcludeFromCodeCoverageAttribute的唯一方法就是在类级别设置属性。