public partial class Form1 : Form
    {
        public int num;
        public void BeginbbsUrlFind()
        {            for (int j = 0; j < 500; j++)
            {
                System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时 
                AddListUrl(j.ToString());
            }        }
        private delegate void AddListUrlCallback(string url);        private void AddListUrl(string url)
        {
            int p = num;            if (this.InvokeRequired)
            {
                AddListUrlCallback method = new AddListUrlCallback(this.AddListUrl);
                this.Invoke(method, new object[] { url });
            }
            else
            {
                listBox1.Items.Add(url.ToString());                //label1.Items.Add(url.ToString());
                label1.Text = "线程" + p + "正在输出" + url;
            }
        }        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {        }        private void button1_Click(object sender, EventArgs e)
        {
            this.listBox1.Items.Clear();
            for (int i = 1; i <= 10; i++)
            {//这里开启了10个线程
                num = i;
                ThreadStart start = new ThreadStart(BeginbbsUrlFind);
                Thread thread = new Thread(start);
                thread.Name = i.ToString();                thread.Start();            }
        }
    }

解决方案 »

  1.   

    num的使用出了问题,启动完线程后num就等于10,此后每个线程显示信息时p=num都是10你可以用 string name = Thread.CurrentThread.Name; 代替 p并且在循环启动线程的时候最好进行延时,使每个线程的启动时间间隔开来,避免线程活跃时间太近导致肉眼看不出区别
      

  2.   

    线程放在循环里,那可不是上一次循环结束才启动下一个,如果上一个太晚执行,而下一个可能就在上一个执行之前就启动了。
    这个代码涉及同步,在thread.Start();后加thread。JOIN()
    或者使用同步上下文,或者使用EVENTWAITHANDLE LOCK等