Thread threadlistBox = new Thread(new ThreadStart(Addclient));
            threadlistBox.IsBackground = true;
            threadlistBox.Start();   //启动一个线程 用来在listBox中添加一行数据
void Addclient()
        {
            while (true)
            {
                if (Add && str != null)
                {
                    Add = false;
                    listBox1.Items.Add(str);
                }
            Thread.Sleep(100);            }        }
// 在另一个监听线程中也访问了Add全局变量 这样会出现问题 希望指教怎么改??
 alSock.Add(sockets[i]);
                        str=((IPEndPoint)sockets[i].RemoteEndPoint).Address.ToString() +" 端口 "+ ((IPEndPoint)sockets[i].RemoteEndPoint).Port.ToString();
                        
                       Add = true;

解决方案 »

  1.   

    private void Listening()
            {
                
                
                while (true)
                {
                    if (ttt)
                    {
                        ttt = false;
                        break;
                    }
                    else
                    {
                        try
                        { //通过组合服务的主机 IP 地址和端口号,IPEndPoint 类形成到服务的连接点。                         
                                
                            listeningSocket.Listen(10); //监听端口,等待客户端连接请求。10是队列中最多可容纳的等待接受的传入连接数 
                            statusBar1.Text = "主机" + txtServer.Text + "端口" + txtPort.Text + "开始监听.....";
                            alSock = new ArrayList();
                           //Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。 
                            sockets[i] = listeningSocket.Accept();
                           // mySocket = sockets[i];
                            alSock.Add(sockets[i]);
                            str=((IPEndPoint)sockets[i].RemoteEndPoint).Address.ToString() +" 端口 "+ ((IPEndPoint)sockets[i].RemoteEndPoint).Port.ToString();
                            listBox1.Items.Add(str);
                           //Add = true;
                           // Addclient(sockets[i]);
                           // listBox1.Items.Add(((IPEndPoint)sockets[i].RemoteEndPoint).Address.ToString() +" 端口 "+ ((IPEndPoint)sockets[i].RemoteEndPoint).Port.ToString());                                        
                           
                           // if (sockets[i].Connected)
                           //ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
                           // MessageBox.Show("I am connected to " + IPAddress.Parse(((IPEndPoint)mySocket.RemoteEndPoint).Address.ToString()) + " on port number " + ((IPEndPoint)mySocket.RemoteEndPoint).Port.ToString());                                                                    
                            i = i + 1;                       
                        }
                        catch (Exception ee)
                        {
                            statusBar1.Text = ee.Message;                    }
                    }
                }        }
      

  2.   

    private void Listening()//这个方法要放在一个新线程里执行吧!因为他有while(true),如果在主线程里的话,就把主线程堵了
      

  3.   

    把add加锁吧,多线程访问同一变量最好加个锁
      

  4.   

    不是说GDI+跨线程操作要用invork方法么
      

  5.   

    public void OutEventLog(string text, int IconFlag)
            {
                DateTime CurrentTime = DateTime.Now;
                if (this.EventlistView.InvokeRequired)
                {
                    //OutDelegate d = new OutDelegate(OutEventLog);
                    this.BeginInvoke(new OutDelegate(OutEventLog), text, IconFlag);
                }
                else
                {
                    Monitor.Enter(EventlistView);
                    //if (OutLog.Items.Count > 2)                //      OutLog.Clear(); 
                    if (EventlistView.Items.Count > 10)
                    {
                        EventlistView.Items .Clear();
                    }
                    EventlistView.Items.Add(text,flag);
                    Monitor.Exit(EventlistView);
                }
            }给你参考下,线程间调用FORM是要BeginInvoke的,建议去看下老外写的进度条算pi的程序
      

  6.   

    谢谢了 
    多线程里面怎么用lock ??
      

  7.   

    Monitor也是锁,参考我的monito也行