调试 .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<int>(() => 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
深入理解 ASP.NET MVC 上的 async/await
当循环在异步函数内部而不是相反时,为啥 Async/Await 可以正常工作?