DebuggerNonUserCode不能与async/await一起工作

本文关键字:await 一起 工作 async 不能 DebuggerNonUserCode | 更新日期: 2023-09-27 18:01:39

所以,我有以下代码:

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

And I F11 (step-into)通过Visual Studio 2013中的所有语句。我希望在Main()的两个调用中都将我步进"return 1"语句。然而,在第二种情况下,它将我带入async函数。

似乎编译器在异步代码生成期间擦除了我的DebuggerNonUserCode。
我的问题是,为什么这样做?我错过什么了吗?

至于我为什么要这样做,我有一些自动生成的helper异步函数,我想避免一直进入它们。

DebuggerNonUserCode不能与async/await一起工作

这是async/await模式的一个常见"问题"。这发生在添加到async方法的所有属性上(我在ExcludeFromCodeCoverageAttribute中发生过这种情况,并对此进行了一些研究)。

发生的是,编译器在await处拆分方法,并将"await之后"的所有内容放入一个新方法中,该方法在await 'ed任务完成时被调用。这个新方法没有从初始方法中获得属性——我不知道为什么。

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