[英]Condition false, but code inside the if statement executed
我有以下方法:
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 為假,為什么執行 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");
}
但為什么?
這可能是調試器和多個線程的問題,嘗試將鎖定放在if語句的外部而不是屬性內部。
調試器中的Expression窗口是觸發異常的窗口,而不是代碼。 刪除表達式(或觀察),它應該按預期工作。
這個答案解釋了我遇到的問題: https : //stackoverflow.com/a/27552124/1830461
將此格式的某些內容編譯為64位可能會導致調試器進入if語句:
if (falseCondition)
throw new Exception();
try { } catch { }
這是Visual Studio中的一個錯誤。 代碼實際上沒有執行。 解決方案是忽略它並繼續單步執行代碼。 在其上放置一個鎖定語句會修復它,因為它不再是那種格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.