2012-10-12 66 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