2012-10-12 32 views
0

我有一個多維數組與互斥體,我用它們,所以一些關鍵部分。最後是我班的素描。鎖(objectReference){}沒有鎖定關鍵部分

現在,我試圖在不停止的情況下在不同線程中添加和刪除字符,並且同時從另一個線程獲取字符以測試我的服務器是否可以正常工作,但是當我嘗試獲取字符時出現異常說這樣的事情:「收集在foreach中修改..」

任何人都知道爲什麼?我已閱讀MSDN中的鎖定語句的文檔,它應該工作,我不知道我做錯了什麼。也許new object[]不能用作互斥量?

如果lock(objectReference)不應該用在這種情況下,我應該用什麼來代替?我班的

素描:

partial class MapCharacter 
{ 
    public MapCharacter() 
    { 
     mutexes = new object[5, 5]; 
     for (int x = 0; x < 5; x++) 
     { 
      for (int y = 0; y < 5; y++) 
      { 
       mutexes[x, y] = new object(); 
      } 
     } 
    } 

    object[,] mutexes; 

    public object RequestMutex(int x, int y) 
    { 
     return mutexes[x, y]; 
    } 

    public void RemoveCharacter(Character characterToRemove) 
    { 
     lock (RequestMutex(characterToRemove.X, characterToRemove.Y)) 
     { 
      loggedCharacters.Remove(characterToRemove); 
     } 
    } 

    public void AddCharacter(Character characterToAdd) 
    { 
     lock (RequestMutex(characterToRemove.X, characterToRemove.Y)) 
     { 
      loggedCharacters.Add(characterToAdd); 
     } 
    } 

    public Character[] GetCharacters(int x, int y) 
    { 
     lock (RequestMutex(characterToRemove.X, characterToRemove.Y)) 
     { 
      foreach (var charact in loggedCharacters) 
      { 
       // exception here 
      } 
     } 
    } 

    // more methods that use the mutex when trying to remove/add/modify characters 
} 
+0

以及loggedCharacters來自哪裏?無論如何,你的代碼示例是有缺陷的。如果你只想屏蔽loggedCharacters,你爲什麼不擁有一個lockLoggedCharacters對象?帶有對象的數組的原因是什麼? – rene

回答

4

您的問題是,你是鎖定的單個字符,但不loggedCharacters。您需要使用鎖來保護loggedCharacters或將其設爲併發收集以避免該異常。

+0

但我唯一使用loggedCharacters的地方是使用RequestMutex的lock()語句,而我只使用一個座標(x = 0,y = 0)。如果總是使用RequestMutex(0,0),那麼這些方法不應該同時運行,對吧? – Pacha

+0

你在循環中做的事情也可能會修改'loggedCharacters',這會導致相同的異常。 – Gabe