我正在使用队列(C#)来存储必须发送到任何连接的客户端的数据。
我的锁定语句是私有只读的:
private readonly object completedATEQueueSynched = new object();
只有两种方法入队:
1) 由鼠标移动启动,由主窗体线程执行:
public void handleEddingToolMouseMove(MouseEventArgs e)
{
AbstractTrafficElement de = new...
sendElementToAllPlayers(de)
lock (completedATEQueueSynched)
{
completedATEQueue.Enqueue(de);
}
}
2)从一个按钮事件开始,也由 mainform-thread 执行(在这里没关系,但比抱歉更安全):
public void handleBLC(EventArgs e)
{
AbstractTrafficElement de = new...
sendElementToAllPlayers(de);
lock (completedATEQueueSynched)
{
completedATEQueue.Enqueue(de);
}
}
此方法由负责连接的特定客户端的线程调用。这里是:
private void sendSetData(TcpClient c)
{
NetworkStream clientStream = c.GetStream();
lock (completedATEQueueSynched)
{
foreach (AbstractTrafficElement ate in MainForm.completedATEQueue)
{
binaryF.Serialize(clientStream, ate);
}
}
}
如果客户端连接并且我同时移动鼠标,则会发生死锁。如果我只锁定迭代,则会抛出 InvalidOperation 执行,因为队列已更改。
我也尝试过同步队列包装器,但它不适用于迭代。(甚至与锁结合)有什么想法吗?我只是不明白我的错误