锁定多线程

时间:2013-12-08 16:02:01

标签: c# multithreading locking

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”。我该如何解决?

1 个答案:

答案 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