日期:2014-05-16  浏览次数:21021 次

给大分:主线程,取子线程结果错乱的问题
功能设计是这样:
winform,界面启动后点击“开始”按钮生成新线程,负责产生随机数字,并在Textbox1中滚动显示。点击“停止”按钮后,中止线程,并将最终的结果记录并输出显示。

现在问题:
点击停止后,获取Textbox1的值,发现并不是线程最后产生的随机值(应该是终止前的某次值)?如何能取到线程产生的随机值呢(与Textbox1最终显示的一致)

分析:如将随机的频率调低(每秒或0.5秒刷新一次),所取的值与Textbox1最后的值是相同的。

程序如图:



代码如下:


        //跨线程安全访问控件委托方法
        delegate void SetTextCallback(string text);
        private Thread doYaohao =null;

        //要显示的随机数
        private string[] word = new string[] { "A01", "B02", "C03", "D04", "E05", "F06", "G07", "H08", "I09", "J10" };

        //开始按钮
        private void button1_Click(object sender, EventArgs e)  
        {
            this.doYaohao = new Thread(new ThreadStart(this.ThreadProcSafe));
            this.doYaohao.IsBackground = true;
            this.doYaohao.Start();
        }
        private void ThreadProcSafe()
        {
            Random rd = new Random();
            int i = rd.Next(0, 9);

            while (true)
            {
                i = rd.Next(0, 9);
                this.SetText(word[i]);
                Thread.Sleep(10);
            }
        }

        //委托方法
        private void SetText(string text)
        {
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
           &nb