我有一個多維數組與互斥體,我用它們,所以一些關鍵部分。最後是我班的素描。鎖(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
}
以及loggedCharacters來自哪裏?無論如何,你的代碼示例是有缺陷的。如果你只想屏蔽loggedCharacters,你爲什麼不擁有一個lockLoggedCharacters對象?帶有對象的數組的原因是什麼? – rene