多个等待语句后,VS2013 C#变量似乎超出范围

时间:2017-11-07 11:51:04

标签: c# debugging asynchronous visual-studio-2013

我正在尝试调试一个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")

我试图解决这个问题:

  • clean build
  • 重启VS
  • 重启PC
  • 重置VS设置
  • 空调试符符号缓存
  • 从另一台没有出现问题的计算机导入VS设置
  • git clean -xfd删除任何临时VS状态?

简单值的影响方式与await语句返回的结果相同。似乎只是一个例子,如果调用的await太多,调试器就无法访问所有变量。

在这种情况下,如果不使用调试器,我似乎不太可能这么做,所以我想说这曾经有用。除了代码之外,我没有故意改变任何其他内容,因此我无法解释为什么它会停止工作。

更新

我现在怀疑它实际上是await的责任。在重构以消除一些重复之后,使调试器失去可见性的语句现在是一个简单的集合初始化器。没有await参与。

更新2:

我忽略了提及,但我最初使用的是代码合同。关闭它们会使问题消失。

更新3:

我试图在一个小型的,自包含的项目中重现这一点,但迄今为止未能模仿引发不当行为的任何复杂性。

0 个答案:

没有答案