[英]Lock in multi-threading
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”。 我该如何解决?
你忘了一个。
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.