DebuggerNonUserCode不能与async/await一起使用。

7

所以,我有以下代码:

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

我用Visual Studio 2013中的F11(单步执行)跟踪所有语句。我期望在Main()调用之间,都能跳转到“return 1”语句处。然而,在第二次调用中,它会将我带入异步函数。
似乎是编译器在异步代码生成期间擦除了我的DebuggerNonUserCode标记。我的问题是,为什么会这样做?我是否漏掉了什么?
至于为什么我想要这样做,是因为有一些辅助的异步函数是自动生成的,我不想一直跳进它们里面去。
1个回答

4
这是async/await模式的一个常见“问题”。这会发生在添加到async方法的所有属性中(我曾在ExcludeFromCodeCoverageAttribute上遇到过这个问题,并进行了一些研究)。
发生的情况是,编译器在await处将该方法分割,并将“await”之后的所有内容放入一个新方法中,在await的任务完成时调用该方法。这个新方法不会获得来自初始方法的属性 - 我不知道为什么。
我所知道的唯一解决方法是对类级别进行属性设置,这对于ExcludeFromCodeCoverageAttribute有效。

是的,这个问题也困扰着与async/await相关的ContextBoundObject属性:https://dev59.com/v33aa4cB1Zd3GeqPfJXR - Matt Smith
好的,我不知道这个。我编辑了答案以反映这个(只有?)适用于ExcludeFromCodeCoverageAttribute。我不知道其他任何东西 - 也许有更好的了解的人可以帮助你。 - Christoph Fink
1
请在Microsoft Connect上发布这些问题。 - Stephen Cleary
是的,我明白了。我们至少应该为Debuggerxxx属性得到一个警告。 - dimio
@chrfin,虽然属性不会传播到嵌套类,但属性的客户端可以自由地应用任何逻辑来决定属性应该应用于什么。例如,他们可以在父类中查找属性并认为它应该应用。但我对你提到的具体情况一无所知。 - Matt Smith
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接