调试 .NET Async/Await 函数时无法检查变量

Posted

技术标签:

【中文标题】调试 .NET Async/Await 函数时无法检查变量【英文标题】:Can't Inspect Variables When Debugging .NET Async/Await Functions 【发布时间】:2013-02-13 12:04:39 【问题描述】:

我有一个使用 async/await 功能的 .NET 4.5 项目。

当我尝试在等待语句之后检查/快速观察变量引用时,我得到以下信息:

The name 'id' does not exist in the current context

知道如何解决这个问题以便我可以调试它吗?

编辑——这里是代码

    [Fact]
    public async Task works_as_expected()
    
        var repo = Config.Ioc.GetInstance<IAsyncRepository<Customer>>();

        var work = Config.Ioc.GetInstance<IUnitOfWork>();
        Customer c= new Customer()
        
            FirstName = "__Micah",
            LastName = "__Smith_test",
            DateCreated = DateTime.Now,
            DateModified = DateTime.Now,
            Email = "m@m.com",
            Phone = "7245551212"
        ; 

        var id=await repo.Insert(c);
        // i can't inspect the value of id
        Assert.True(id > 0);
    

【问题讨论】:

您何时尝试检查 id?真的是在var id... 行之后吗? 确实如此——这在我的代码中无处不在,这只是一个非常简化的代码版本,它也会发生。我希望能够解释为什么它会发生在微观上,最终也会告诉我为什么会发生在宏观上 这对我有用。我创建了一个超级简化的实现。 var id = await Task.Factory.StartNew&lt;int&gt;(() =&gt; System.Threading.Thread.Sleep(1000); return 1; );return id; 我想知道这里是否有任何 IL(repo 使用 ORM)可能会阻止它...... 我怀疑我也有同样的问题***.com/q/26502128/1085837 关于 IL 的有趣评论,我的代码使用了使用大量 IL 的 dapper 【参考方案1】:

那个变量还不存在,所以没有办法检查它的值。它没有价值(还)。

从技术上讲,在您到达定义它的代码行之前,它不会被定义,并且在您初始化它之前它不会有值。虽然在某些情况下,您可以在分配变量之前从技术上检查变量的值,但在代码中(不安全代码之外)永远无法访问该值,因此几乎没有理由查看它。

至于何时分配该位置的内存(即您第一次可以选择在调试器中查看它时),将在您到达变量之前的最后一个 await 之后的第一行之后被使用了。

【讨论】:

以上是关于调试 .NET Async/Await 函数时无法检查变量的主要内容,如果未能解决你的问题,请参考以下文章

.save() 无法使用 async/await 正确保存到 mongoDB

async 和 await

深入理解 ASP.NET MVC 上的 async/await

当循环在异步函数内部而不是相反时,为啥 Async/Await 可以正常工作?

async / await 如何在 ASP.Net 应用程序中提供帮助?

使用 Typescript+VSCode 调试 Node.js Async/Await