C# 锁定多线程 类端口 { 静态只读对象锁定器=新对象(); 连接列表=新列表 公共void MethodX() { 睡眠(10000); 锁(储物柜) { 连接列表。删除(0); } } public void ReceiveFromSwitch() { 锁(储物柜) { 如果(listOfConnections.Count==0)listOfConnections.Add(newconnection()); if(listOfConnections.Count==1)MessageBox.Show(“任意”); 新线程(()=>MetohodX()).Start(); } } }

C# 锁定多线程 类端口 { 静态只读对象锁定器=新对象(); 连接列表=新列表 公共void MethodX() { 睡眠(10000); 锁(储物柜) { 连接列表。删除(0); } } public void ReceiveFromSwitch() { 锁(储物柜) { 如果(listOfConnections.Count==0)listOfConnections.Add(newconnection()); if(listOfConnections.Count==1)MessageBox.Show(“任意”); 新线程(()=>MetohodX()).Start(); } } },c#,multithreading,locking,C#,Multithreading,Locking,这是我的代码,两个不同的线程调用方法ReceiveFromSwitch()。我的目标是得到一个“随便”的信息框。一个线程先开始。它进入ReceiveFromSwitch,锁定资源,第二个线程正在等待释放资源。添加列表上的一个连接后,它进入MethodX()并释放队列中某个线程的方法ReceiveFromSwitch。第二个步骤进入方法。计数等于1,因此显示消息 它不起作用。它给出了两个信息“无论什么”。我怎样才能修好它 你忘了另一个 class Port { static readonl

这是我的代码,两个不同的线程调用方法ReceiveFromSwitch()。我的目标是得到一个“随便”的信息框。一个线程先开始。它进入ReceiveFromSwitch,锁定资源,第二个线程正在等待释放资源。添加列表上的一个连接后,它进入MethodX()并释放队列中某个线程的方法ReceiveFromSwitch。第二个步骤进入方法。计数等于1,因此显示消息

它不起作用。它给出了两个信息“无论什么”。我怎样才能修好它

你忘了另一个

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();
        }
    }
}
发生的情况是第一个线程进入并向列表添加连接,然后立即显示消息,因为
计数现在是1。
第二个线程进入并按预期显示第二条消息


您的代码还有一个问题。第二个线程也将触发MethodX,当它在10秒后执行时,它将尝试从一个已经为空的列表中删除索引0,这会导致一个愚蠢的问题
ArgumentOutOfRangeException

,但是这两个线程在
端口的同一实例上调用该方法吗?因为列表不是静态的。是的。这是同一个实例。我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。谢谢,不过这只是一个基于更长代码的示例。解决办法更深刻。Locker做得很好,但我很困惑,我怀疑我的无能是工作不正常的原因。
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());
}