条件为false,但if语句中的代码已执行

我有以下方法:

public bool ConnectAsync() { if (IsConnected) throw new InvalidOperationException("Socket is already connected"); if (IsConnecting) { throw new InvalidOperationException("Attempt to connect in progress"); } . . . } 

哪里:

  private readonly object padLock = new object(); private bool isConnecting = false; public bool IsConnected { get { lock (padLock) { return socket.Connected; } } } public bool IsConnecting { get { lock (padLock) { return isConnecting; } } private set { lock (padLock) { isConnecting = value; } } } 

在此处输入图像描述

如果我的变量isConnecting为false,为什么执行if语句中的代码?

编辑
如果我使用提交的isConnecting而不是属性IsConnecting我有相同的行为。 代码在任何地方都在同一个线程中运行。

编辑2

最后这个工作:

 lock (padLock) { if (IsConnecting) throw new InvalidOperationException("Attempt to connect in progress"); } 

这有效:

 { if (IsConnecting) throw new InvalidOperationException("Attempt to connect in progress"); } 

但为什么?

调试器中的Expression窗口是触发exception的窗口,而不是代码。 删除表达式(或观察),它应该按预期工作。

这可能是调试器和多个线程的问题,尝试将锁定放在if语句的外部而不是属性内部。

这个答案解释了我遇到的问题: https : //stackoverflow.com/a/27552124/1830461

将此格式的某些内容编译为64位可能会导致调试器进入if语句:

  if (falseCondition) throw new Exception(); try { } catch { } 

这是Visual Studio中的一个错误。 代码实际上没有执行。 解决方案是忽略它并继续单步执行代码。 在其上放置一个锁定语句会修复它,因为它不再是那种格式。