给大分:主线程,取子线程结果错乱的有关问题
给大分:主线程,取子线程结果错乱的问题
功能设计是这样:
winform,界面启动后点击“开始”按钮生成新线程,负责产生随机数字,并在Textbox1中滚动显示。点击“停止”按钮后,中止线程,并将最终的结果记录并输出显示。
现在问题:
点击停止后,获取Textbox1的值,发现并不是线程最后产生的随机值(应该是终止前的某次值)?如何能取到线程产生的随机值呢(与Textbox1最终显示的一致)
分析:如将随机的频率调低(每秒或0.5秒刷新一次),所取的值与Textbox1最后的值是相同的。
程序如图:

代码如下:
------解决方案--------------------
Random rd = new Random();这个放在函数外面。作为成员变量。
------解决方案--------------------
bool stopped=false;
//委托方法
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
功能设计是这样:
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 });
}
else
{
this.textBox1.Text = text;
}
}
//停止按钮
private void button2_Click(object sender, EventArgs e)
{
this.doYaohao.Abort();
this.label2.Text = this.label2.Text + "结果:" + this.textBox1.Text + System.Environment.NewLine;
}
}
------解决方案--------------------
Random rd = new Random();这个放在函数外面。作为成员变量。
------解决方案--------------------
bool stopped=false;
//委托方法
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else