2013-12-08 109 views
0
class Port 
{ 
    static readonly object locker = new object(); 
    List<Connection> listOfConnections = new List<Connection> 

    public void MethodX() 
    { 
     Thread.Sleep(10000); 
     lock(locker) 
     { 
      listOfConnections.RemoveAt(0); 
     } 
    } 

    public void ReceiveFromSwitch() 
    { 
     lock(locker) 
     { 
      if(listOfConnections.Count == 0) listOfConnections.Add(new Connection()); 
      if(listOfConnections.Count == 1) MessageBox.Show("Whatever"); 

      new Thread(()=>MetohodX()).Start(); 
     } 
    } 
} 

這是我的代碼,兩個不同的線程調用方法ReceiveFromSwitch()。我的目標是給一個消息框「無論」。一個線程首先啓動。它進入ReceiveFromSwitch,鎖定資源,第二個線程正在等待資源釋放。在列表中添加一個連接,它進入MethodX()並釋放隊列中線程的方法ReceiveFromSwitch。第二個步驟進入該方法。計數等於1,因此它顯示消息。鎖定多線程

它不起作用。它給出了兩個信息「無論」。我該如何解決它?

+0

愚蠢的問題,但是兩個線程調用'端口'的同一個實例的方法?因爲列表不是靜態的。 – Rotem

+0

是的。它是同一個實例。 – user3076439

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

你忘了別的。

if(listOfConnections.Count == 0) listOfConnections.Add(new Connection()); 
else if(listOfConnections.Count == 1) MessageBox.Show("Whatever"); 

//or better yet 
if (listOfConnections.Any()) 
{ 
    MessageBox.Show("Whatever"); 
} 
else 
{ 
    listOfConnections.Add(new Connection()); 
} 

發生了什麼事是第一個線程進入,並添加到列表中的連接,然後立即顯示消息,因爲Count現在是1 第二個線程進入,如預期,顯示第二個消息。

你的代碼還有另一個問題。第二個線程也會觸發MethodX,當它在10秒後執行時,它將嘗試從已經爲空的列表中刪除索引0,導致ArgumentOutOfRangeException

+0

謝謝,但它只是一個基於更長代碼的例子。解決方案更深入。洛克做得很好,但我很困惑,以至於我懷疑我的無能是造成工作不正常的原因。 – user3076439