我有一个多维数组与互斥体,我用它们,所以一些关键部分。最后是我班的素描。锁(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