我正在尝试调试一个C#单元测试,它执行多个await
来设置一些数据库状态。在早期声明和分配的变量最初是可见的,但随着我逐步完成该方法,无论是通过步进还是继续到稍后的断点,这些变量都“超出范围”。
我引用“超出范围”因为:
但是,调试器无法再看到它们(“当前上下文中不存在名称'someVariable'”)。代码遵循以下模式:
await SomeAsyncCleanupMethod()
var someVar = 123;
var testData1 = SomeFactoryMethod()
var modifiedData1 = await ProcessData(testData1)
await SaveData(modifiedData1)
var testData2 = SomeFactoryMethod()
var modifiedData2 = await ProcessData(testData2)
await SaveData(modifiedData2)
var testData3 = SomeFactoryMethod()
var modifiedData3 = await ProcessData(testData3)
// Up to this point, all declared variables are inspectable, either
// by a watch, or by hovering the mouse pointer
await SaveData(modifiedData3)
// From here on, no declared variables are inspectable
// ("The name 'someVar' does not exist in the current context")
我试图解决这个问题:
git clean -xfd
删除任何临时VS状态?简单值的影响方式与await
语句返回的结果相同。似乎只是一个例子,如果调用的await
太多,调试器就无法访问所有变量。
在这种情况下,如果不使用调试器,我似乎不太可能这么做,所以我想说这曾经有用。除了代码之外,我没有故意改变任何其他内容,因此我无法解释为什么它会停止工作。
更新
我现在怀疑它实际上是await
的责任。在重构以消除一些重复之后,使调试器失去可见性的语句现在是一个简单的集合初始化器。没有await
参与。
更新2:
我忽略了提及,但我最初使用的是代码合同。关闭它们会使问题消失。
更新3:
我试图在一个小型的,自包含的项目中重现这一点,但迄今为止未能模仿引发不当行为的任何复杂性。