class Port
{
static readonly object locker = new object();
List<Connection> listOfConnections = new List<Connection>
public void MethodX()
{
Thread.Sleep(10000);
lock(locker)
{
listOfConnections.RemoveAt(0);
}
}
public void ReceiveFromSwitch()
{
lock(locker)
{
if(listOfConnections.Count == 0) listOfConnections.Add(new Connection());
if(listOfConnections.Count == 1) MessageBox.Show("Whatever");
new Thread(()=>MetohodX()).Start();
}
}
}
这是我的代码,两个不同的线程调用ReceiveFromSwitch()方法。我的目标是给一个消息框“随便”。一个线程首先启动。它进入ReceiveFromSwitch,锁定资源,第二个线程正在等待释放资源。添加列表上的连接,它将进入MethodX()并为队列中的线程释放ReceiveFromSwitch方法。第二步进入该方法。计数等于1,因此显示消息。
它不起作用。它给出了两条消息“Whatever”。我该如何解决?
答案 0 :(得分:1)
你忘了别人。
if(listOfConnections.Count == 0) listOfConnections.Add(new Connection());
else if(listOfConnections.Count == 1) MessageBox.Show("Whatever");
//or better yet
if (listOfConnections.Any())
{
MessageBox.Show("Whatever");
}
else
{
listOfConnections.Add(new Connection());
}
正在发生的事情是第一个线程进入并添加到列表的连接,然后立即显示该消息,因为Count
现在为1。
第二个线程进入,并按预期显示第二个消息。
您的代码还有另一个问题。第二个线程也将触发MethodX
,当它在10秒后执行时,它将尝试从已经空的列表中删除索引0,从而导致ArgumentOutOfRangeException
。