我从数据库中读出服务器列表,然后sock去连接,判断异常代码,然后把服务器IP 状态什么的多先程列在listview上
并且,如果不通,就给相关人员发短信现在发现发端信时,给出的ip是错误的,因为多线程操作时改变了变量
可是我加 
lock(this)
{
 
}
也不行,请大家帮忙,代码片段如下:
xxxxx
xxxxx
得到数据库连接
while (MyReader.Read())
                {
                    
                    lock (this)
                    {
                        MonitorIP = MyReader["ServerIP"].ToString();
                    }
                }
xxxx
xxxx
xxxx
                    StatusList.Items.Add(li);
                    for (; orders < this.StatusList.Items.Count; )
                    {
                        Thread oThread = new Thread(new ThreadStart(GetStatus));//在这得到状态并且发短信
                        oThread.IsBackground = true;
                        oThread.Start();
                        Thread.Sleep(100);
                        orders++;
                    }
public void GetStatus()
        {
            int temp = orders;
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                sock.Connect(MonitorIP, MonitorPort);
                sock.Listen(0);
            }
            catch (SocketException exp)
            {
                if (exp.ErrorCode != 10056)
                {               
                    ServiceStatus = 1;
                    strServiceStatus = "Timed Out";
                    App_Code.SMS.SendSMS(MonitorIP, "出现异常");//发短信
                }
                else
                {
                    ServiceStatus = 0;
                    strServiceStatus = "isConnected";
                }
            }
        }现在IP状态列在listview里,以及显示它的状态都正常,怎么发短信的时候就不行了呢??
请高手帮忙~ 谢谢.

解决方案 »

  1.   

    错了,这段应该是这样:
    while (MyReader.Read())
                    {
                        
                        lock (this)
                        {
                            MonitorIP = MyReader["ServerIP"].ToString();
                        }
                             StatusList.Items.Add(li);
                        for (; orders < this.StatusList.Items.Count; )
                        {
                            Thread oThread = new Thread(new ThreadStart(GetStatus));//在这得到状态并且发短信
                            oThread.IsBackground = true;
                            oThread.Start();
                            Thread.Sleep(100);
                            orders++;
                        }
    }
      

  2.   

    你这样是不行的,你可以将IP作为一个参数传递到每个线程,这样才能保重每个IP是本身所用的,
      

  3.   

     Thread oThread = new Thread(new ThreadStart(GetStatus));//在这得到状态并且发短改成
     Thread oThread = new Thread(new ParameterizedThreadStart(GetStatus));//在这得到状态并且发短
    oThread.Start(MonitorIP);
    -----------------public void GetStatus()
    改成
    public void GetStatus(object MonitorIP1)