.net C#-For循环迭代器在循环内突然增加

.net C#-For循环迭代器在循环内突然增加,.net,multithreading,tcp,thread-safety,.net,Multithreading,Tcp,Thread Safety,我正在用C#制作一个TCP服务器,我有以下几个代码: TCP服务器: private void startButton_Click(object sender, EventArgs e) { Server.Bind(Self); Server.Listen(10); Accept = new Thread(HandleClients); Receive = new Thread(HandleMes

我正在用C#制作一个TCP服务器,我有以下几个代码:

TCP服务器:

private void startButton_Click(object sender, EventArgs e)
      {
           Server.Bind(Self);
           Server.Listen(10);
           Accept = new Thread(HandleClients);
           Receive = new Thread(HandleMessages);
           Accept.Start();
           Receive.Start();
      }
      void HandleClients()
      {
           while (true)
           {
                AllUsers.Add(new Participant(Server.Accept()));
           }
      }
      void HandleMessages()
      {
           while (true)
           {
                int Count = AllUsers.Count;
                for (int i = 0; i < Count; i++)
                {
                     if (AllUsers[i].Socket.Available > 0)
                     {
                          byte[] Data = new byte[1500];
                          AllUsers[i].Socket.Receive(Data); // i == 0 right here
                          Thread handle = new Thread(() => HandleInput(Data, AllUsers[i])); // all of the sudden i==1 right here
                          handle.Start();
                     }
                     Thread.Sleep(1);
                }
                Thread.Sleep(1);
           }
      }
private void connectButton_Click(object sender, EventArgs e)
          {
               Client.Connect(Server);
               Send("0x01" + "!" + usernameText.Text); // Send username
               ReceiveThread = new Thread(Receive);
               ReceiveThread.Start();
          }
如您所见,服务器代码旨在接受和处理多个TCP连接,而不使用异步I/O(我使用Socket.Available属性来检查数据)

因此,当有人连接时,服务器有时会崩溃。当用户连接时,他会在连接后立即发送用户名,这会导致服务器打开一个新线程来处理用户的数据包

因此,有时,当有人连接并发送用户名时(用户名发送在连接后立即发生),服务器会在FOR循环中的IF区域崩溃。崩溃发生在使用lambda表达式创建新线程的部分-不知何故,有时FOR循环(i)的迭代器在没有明显原因的情况下增加了1,这会导致抛出ArgumentOutOfRangeException

例如,在任何人连接之前,列表的计数为0。当有人连接时,他立即被添加到用户列表中,将其计数从0增加到1。现在,FOR循环在他连接后终于开始工作了,但有时会发生一些奇怪的事情。在接收行,变量i等于0,该行接收字节数组并将其放入数据变量。在下一行中,将创建一个新线程,并将当前用户对象(AllUsers[i])作为参数传递给它。但奇怪的是,有时当传递参数时,变量i不知何故变为等于1,结果抛出异常

有人知道为什么会这样吗?我认为是多线程出错了,但我不确定是什么原因

谢谢


-BlueRay101-

您需要通过锁监控共享资源的访问。在这种情况下,可以同时从多个线程访问列表用户。如果将第一个thread.sleep值增加到50以上,则使用例如
lock(alluser){…}
。循环在一边继续。当线程开始在另一端运行时。好的,谢谢,我知道我应该使用锁,而且将它增加到50也不是一个选项,因为这里的速度很关键。但我还是搞不清楚:迭代器是怎么在中间循环的?是否另一个线程更改了循环的迭代器?如果不是,什么可以增加循环中间的迭代器呢?