private void ScanTarget()
    {
        //构造IP地址的31-8BIT 位,也就是固定的IP地址的前段
        // numericUpDown1是定义的System.Windows.Forms.NumericUpDown控件
        string strIPAddress=numericUpDown1.Text+"."+numericUpDown2.Text+"."+numericUpDown3.Text+".";
        //开始扫描地址
         int nStrat = Int32.Parse(numericUpDown4.Text);
            //终止扫描地址
         int nEnd = Int32.Parse(numericUpDown5.Text);
        //扫描的操作
        for(int i=nStrat;i<=nEnd;i++)
        {
            string strScanIPAdd = strIPAddress +i.ToString();
            //转换成IP地址
            IPAddress myScanIP = IPAddress.Parse(strScanIPAdd);
            
            try
            {
                //你可以加入自已的,增强功能
                // Dns.GetHostByAddress 方法: 根据 IP 地
                //址获取 DNS 主机信息。
                //IPHostEntry myScanHost = Dns.GetHostByAddress(myScanIP  );
                IPHostEntry myScanHost = Dns.GetHostEntry(myScanIP);
                
                //获取主机的名
                string strHostName = myScanHost.HostName.ToString();
                richTextBox1.AppendText(strScanIPAdd + "  " + strHostName + "\r");
            }
            catch(Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }//for    
    }//private这个函数 在多线程里 报错了 private void button3_Click(object sender, EventArgs e)
        {            //Thread 类: 创建并控制线程
            Thread thScan = new Thread(new ThreadStart(ScanTarget));
            thScan.Start();
          }错误如下:
 Cross- thread operation not valid: controls 'richtextbox1'  accessed from a  thread other
than the thread it was created on.
咋解决啊?

解决方案 »

  1.   

    Thread thScan = new Thread(new ThreadStart(Run));
    thScan.Start();
    private void Run()
    {
             MethodInvoker mi = new MethodInvoker(ScanTarget);
             while (true)
             {
              Invoke(mi);                            
              Thread.Sleep(10);
             }
                
     }
      

  2.   

    还有 我用SINFFER 时,列出公司内的几百台机子也很快嘛
      

  3.   

    while(true)当然一直占着啦,mi.BeginInvoke(null,null);
      

  4.   


    string strHostName = myScanHost.HostName.ToString();
                    
    Thread.Sleep(100);     //修改前休眠线程richTextBox1.AppendText(strScanIPAdd + "  " + strHostName + "\r");
      

  5.   

    string strHostName = myScanHost.HostName.ToString();
                    
    Thread.Sleep(100);     //修改前休眠线程richTextBox1.AppendText(strScanIPAdd + "  " + strHostName + "\r");按你的这样写法 ,还是有错误啊错误如下:
     Cross- thread operation not valid: controls 'richtextbox1'  accessed from a  thread other
    than the thread it was created on.
    咋解决啊?
      

  6.   

    richTextBox1.AppendText(strScanIPAdd + "  " + strHostName + "\r");
    因为这个的问题,同时往里面添加值肯定不行
      

  7.   

    private Object thislock = new Object();
    lock(thislock) {
      richTextBox1.AppendText(strScanIPAdd + "  " + strHostName + "\r");
    }
      

  8.   

    错误如下:
     Cross- thread operation not valid: controls 'richtextbox1'  accessed from a  thread other
    than the thread it was created on.
    ---------------------------------------
    跨线程操作无效,你从非界面线程访问richtextbox1控件。
    使用控件Invoke方法,或把方法委托给线程
      

  9.   

    SORRY,一开始理解错误,而且当成是2003
    下面是我用05改了一下
    public delegate void OutPutDelegate(string outputStr);public void OutPut(string outputStr) {
                if (this.InvokeRequired) {
                    OutPutDelegate opd = new OutPutDelegate(OutPut);
                    this.BeginInvoke(opd, new object[] { outputStr });
                }
                else {
                    this.richTextBox1.AppendText(outputStr);
                }
            }
    private void ScanTarget()
        {
            //构造IP地址的31-8BIT 位,也就是固定的IP地址的前段
            // numericUpDown1是定义的System.Windows.Forms.NumericUpDown控件
            string strIPAddress=numericUpDown1.Text+"."+numericUpDown2.Text+"."+numericUpDown3.Text+".";
            //开始扫描地址
             int nStrat = Int32.Parse(numericUpDown4.Text);
                //终止扫描地址
             int nEnd = Int32.Parse(numericUpDown5.Text);
            //扫描的操作
            for(int i=nStrat;i<=nEnd;i++)
            {
                string strScanIPAdd = strIPAddress +i.ToString();
                //转换成IP地址
                IPAddress myScanIP = IPAddress.Parse(strScanIPAdd);
                
                try
                {
                    //你可以加入自已的,增强功能
                    // Dns.GetHostByAddress 方法: 根据 IP 地
                    //址获取 DNS 主机信息。
                    //IPHostEntry myScanHost = Dns.GetHostByAddress(myScanIP  );
                    IPHostEntry myScanHost = Dns.GetHostEntry(myScanIP);
                    
                    //获取主机的名
                    string strHostName = myScanHost.HostName.ToString();
                    this.OutPut(strScanIPAdd + "  " + strHostName + "\r");
                }
                catch(Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }//for    
        }//privateprivate void button3_Click(object sender, EventArgs e)
            {            //Thread 类: 创建并控制线程
                Thread thScan = new Thread(new ThreadStart(ScanTarget));
                thScan.Start();
              }