我的程序如下:
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 MultiThread
{
    public partial class frmMain : Form
    {
        int a = 0;
        int b = 0;        ThreadStart start;
        Thread newthread ;        ThreadStart end ;
        Thread newthread1;        public frmMain()
        {
            InitializeComponent();
        }        private void btnThread_Click(object sender, EventArgs e)
        {
            newthread1.Start();
            newthread.Start();
        }        private void frmMain_Load(object sender, EventArgs e)
        {
            end = new ThreadStart(UpdateText1);
            newthread1 = new Thread(end);            start = new ThreadStart(UpdateText);
            newthread = new Thread(start);
            
        }        private void UpdateText1()
        {
            for (int i = 0; i < 2000; i++)
            {
                a = i;
                eee.Text = a.ToString();
            }
        }        private void UpdateText()
        { 
            for (int i = 0; i < 2000; i++)
            {
                b = a;
                hhh.Text = b.ToString();
            }
        }        private void btnAbort1_Click(object sender, EventArgs e)
        {
            newthread.Abort();
        }
    }
}我本想看到hhh.Text与eee.Text一齐变,最后都为1999,但运行时hhh.Text立即变为0,而eee.Text连续的增加变为1999,请高手指点,我在a=i,b=a,后都加入Thread.Sleep(50);时,可以看到我想要的结果。

解决方案 »

  1.   

    newthread1.Start(); 
                newthread.Start(); 太快了!newthread1.Start(); 一执行就结束了
      

  2.   

    你要两个线程同步起来把i  变成变量
    然后每个线程要访问i之前必须LOCK同时,不要用Start();  来通知线程开始应该设置一个变量如F,先吧线程都启动起来,此时F为FALSE,两个线程不断检测到F不运行然后,开始按钮把F设置为TRUE,然后使两个线程真正运行起来当然为了看起来更合理点,至少要SLEEP(1)一下
      

  3.   

    newthread1.Start();  
                newthread.Start();  太快了! newthread1.Start(); 一执行就结束了不是太快了,如果是这样的话,那么b应该为1999了,hhh.Text也为1999了
      

  4.   

    运行了几次,hhh.Text立即变为1,0,178,209等几个任意值,然后就不变了,但eee.Text还在增加
      

  5.   

    这说明两个线程是同时执行的,但newthread这个线程执行得很快,先执行完了,newthread1还没有执行完。
      

  6.   

    对于控件eee,hhh的操作要通过Invoke的方式在UI线程里面操作, 否则程序的行为会产生未知的后果.
      

  7.   

    eee,hhh是不需要通过Invoke调用的,它们是StatusLabel控件,我无意中发现其它的如button,EditBox,listBox等都需要Invoke方式,但StatusLabel不需要,不知道为什么?