using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace test3
{
    public delegate void UpdateList(string sIP, string sHostName);    public partial class Form1 : Form
    {
        private System.DateTime StartTime;        public Form1()
        {
            InitializeComponent();
        }
        
        //封装
        public class ping
        {
            public UpdateList UL;
            public string IP;
            private MethodInvoker MI;
            //定义一个变量,用以接收传送来的IP地址字符串
            public string HostName;
            //定义一个变量,用以向主进展传递对应IP地址是否在线数据
            public void scan()
            {
                IPAddress myIP = IPAddress.Parse(IP);
                try
                {
                    //IPHostEntry myHost = Dns.GetHostByAddress(myIP);
                    IPHostEntry myHost = Dns.GetHostEntry(myIP);
                    string HostName = myHost.HostName.ToString();
                }
                catch
                {
                    HostName = "";
                }
                if (HostName == "")
                    HostName = "主机没有响应!";
                if (UL != null)
                    UL(IP,HostName);
            }
            //定义一个过程(也可以看出方法),用以判断传送来的IP地址对应计算机是否在线
        }        void UpdateMyList(string sIP, string sHostName)
        {
            MethodInvoker MI = new MethodInvoker(HostPing.scan);
            this.BeginInvoke(MI);
            lock (listBox1)
            {
                listBox1.Items.Add(sIP + "" + sHostName);
                if (progressBar1.Value != progressBar1.Maximum)
                {
                    progressBar1.Value++;
                }
                if (progressBar1.Value == progressBar1.Maximum)
                {
                    MessageBox.Show("成功完成检测!","提示");
                    DateTime EndTime = DateTime.Now;
                    TimeSpan TS = EndTime - StartTime;
                    label4.Text = TS.Seconds.ToString() + "秒";
                    //显示扫描计算机所需要的时间                    progressBar1.Value = progressBar1.Minimum;
                }
            }
        }        #region invoke        /// <summary>
        /// Delegate function to be invoked by main thread
        /// </summary>
        private void InvokeFun()
        {
            if (progressBar1.Value < progressBar1.Maximum)
                progressBar1.Value = progressBar1.Value + 1;
        }        /// <summary>
        /// Thread function interface
        /// </summary>
        private void ThreadFun()
        {
            //Create invoke method by specific function
            MethodInvoker mi = new MethodInvoker(this.InvokeFun);            for (int i = 0; i < progressBar1.Maximum; i++)
            {
                this.BeginInvoke(mi);
                Thread.Sleep(progressBar1.Maximum);
            }
        }        #endregion        public ping HostPing = new ping();
        private void button1_Click(object sender, EventArgs e)
        {
            #region 未用多线程处理的代码            //listBox1.Items.Clear();
            ////清楚扫描显示区域
            //StartTime = DateTime.Now;
            ////获取当前时间
            //string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
            //int Min = (int)numericUpDown4.Value;
            //int Max = (int)numericUpDown5.Value;
            //int i;
            //for (i = Min; i <= Max; i++)
            //{
            //    string ip = mask + i.ToString();
            //    IPAddress myIP = IPAddress.Parse(ip);
            //    //根据给定的IP地址字符串,处境IPAddress实例
            //    try
            //    {
            //        IPHostEntry myHost = Dns.GetHostByAddress(myIP);
            //        string HostName = myHost.HostName.ToString();
            //        listBox1.Items.Add(ip + "名称为:" + HostName);
            //    }
            //    catch
            //    {
            //        listBox1.Items.Add(ip + "主机没有响应!");
            //    }
            //    progressBar1.Value = i;
            //}
            ////扫描给定IP对应的计算机是否在线
            //DateTime EndTime = DateTime.Now;
            //TimeSpan TS = EndTime - StartTime;
            ////获得扫描网络计算机所用的时间
            //label4.Text = TS.Seconds.ToString() + "秒";
            //label4.Visible = true;
            //MessageBox.Show("成功完成检测!", "提示");
            //progressBar1.Value = Min;            #endregion            #region 使用多线程处理的代码            listBox1.Items.Clear();
            //清楚扫描显示区域            StartTime = DateTime.Now;
            //获取当前时间            string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
            int Min = (int)numericUpDown4.Value;
            int Max = (int)numericUpDown5.Value;
            if (Min > Max)
            {
                MessageBox.Show("输入的IP地址区间不合法,请检查!", "错误!");
                return;
            }
            //判断输入的IP地址区间是否合法            int ThreadNum = Max - Min + 1;
            Thread[] myThread = new Thread[ThreadNum];
            //创建一个多线程的实例            progressBar1.Minimum = Min;
            progressBar1.Maximum = Max + 1;
            progressBar1.Value = Min;
            int i;
            //MethodInvoker MI; 
            for (i = Min; i <= Max; i++)
            {
                int k = Max - i;
                //ping HostPing = new ping();
                ////创建一个ping实例                //MI = new MethodInvoker(HostPing.scan);
                //this.BeginInvoke(MI);
                HostPing.IP = mask + i.ToString();
                HostPing.UL = new UpdateList(UpdateMyList);
                //向这个ping实例中传递IP地址字符串                myThread[k] = new Thread(new ThreadStart(HostPing.scan));
                //初始化一个线程实例                myThread[k].Start();
                //启动线程
            }            //for (i = Min; i <= ThreadNum; i++)
            //{
            //    Thread.Sleep(i);
            //}            #endregion
        }        private void Form1_Load(object sender, EventArgs e)
        {
            label4.Visible = false;
        }
    }
}原文是在http://www.itepub.net/html/article/bianchengkaifa/cnetok/wangluobiancheng/2006/0428/2162.html
我想该成在.net2005里运行的程序,但是总是提示:Cross-thread operation not valid
该如何在.net2005中实现多线程呢?invoke语句该放到哪里?如何写?

解决方案 »

  1.   

    代码太长...看不下去...
    既然提示跨线程操作无效...很可能是调用UI控件的时候没有用BeginInvoke()...
      

  2.   

    知道无效,但是不知道解决方法,不知道怎么设置这里的BeginInvoke(),主要是这个函数
    void  UpdateMyList(string  sIP,  string  sHostName)  
                   {  
                           MethodInvoker  MI  =  new  MethodInvoker(HostPing.scan);  
                           this.BeginInvoke(MI);  
                           lock  (listBox1)  
                           {  
                                   listBox1.Items.Add(sIP  +  ""  +  sHostName);  
                                   if  (progressBar1.Value  !=  progressBar1.Maximum)  
                                   {  
                                           progressBar1.Value++;  
                                   }  
                                   if  (progressBar1.Value  ==  progressBar1.Maximum)  
                                   {  
                                           MessageBox.Show("成功完成检测!","提示");  
                                           DateTime  EndTime  =  DateTime.Now;  
                                           TimeSpan  TS  =  EndTime  -  StartTime;  
                                           label4.Text  =  TS.Seconds.ToString()  +  "秒";  
                                           //显示扫描计算机所需要的时间  
     
                                           progressBar1.Value  =  progressBar1.Minimum;  
                                   }  
                           }  这里会总是提示listview1控件跨线程操作出错,不知道怎么改整个程序,求助……
      

  3.   

    你的invoke方法写的不对,需要单独写一方法,然后在线程方法中进行调用!
    给你个例子吧,这是M$上的
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;using System.Threading;namespace Updating_UI_Controls
    {
        public partial class Form1 : Form
        {
            private bool processingDone;
            private Thread myWorkerThread;        public Form1()
            {
                InitializeComponent();
            }        private void button2_Click(object sender, EventArgs e)
            {
                processingDone = true;
                myWorkerThread.Join();
                button2.Enabled = false;
                button1.Enabled = true;
            }        private void ExecuteProcessing()
            {
                UpdateLabelDelegate labelUpdater = new UpdateLabelDelegate(UpdateLabel);
                this.Invoke(labelUpdater, new object[]{"Processing: Active", Color.Red});
            //    label1.Text = "Processing: Active";
            //    label1.ForeColor = Color.Red;            try
                {
                    while (!processingDone)
                    {
                        Thread.Sleep(0);
              //          this.Invoke(labelUpdater, new object[] { "Processing: Still Active - " + DateTime.Now, Color.Green });
                        this.BeginInvoke(labelUpdater, new object[] { "Processing: Still Active - " + DateTime.Now, Color.Green });
              //          label1.Text = "Processing: Still Active - " + DateTime.Now;
              //          label1.ForeColor = Color.Green;
                    }
                }
                finally
                {
                    Thread.Sleep(1000);
                  //  this.Invoke(labelUpdater, new object[] { "Processing: Done", Color.Black });
                    this.BeginInvoke(labelUpdater, new object[] { "Processing: Done", Color.Black });
              //      label1.Text = "Processing: Done";
              //      label1.ForeColor = Color.Black;
                }
            }        delegate void UpdateLabelDelegate(string labelText, Color textColor);
            private void UpdateLabel(string labelText, Color textColor)
            {
                label1.Text = labelText;
                label1.ForeColor = textColor;
            }        private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                button2.Enabled = true;
              
                processingDone = false;            myWorkerThread = new Thread(new ThreadStart(ExecuteProcessing));
                myWorkerThread.Start();
            }
        }
    }
      

  4.   

    可以自己去下了
    http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242374