多线程与文本框控件
本文关键字:控件 文本 多线程 | 更新日期: 2023-09-27 18:05:27
我是c#初学者。我不明白为什么接下来的两个例子会给出不同的结果。我在msdn中使用微软的例子。在第一个示例中,它在文本框中显示一个数字。在第二个示例中,它为每个线程显示从0到1000的所有数字。
第一个例子:
delegate void SetTextCallback(object text);
private void WriteString(object text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(WriteString);
this.BeginInvoke(d, new object[] { text });
}
else
{
for (int i = 0; i <= 1000; i++)
{
textBox1.Text = text.ToString();
}
}
}
第二个例子:
private void MyApp_Load(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
private void WriteString(object text)
{
for (int i = 0; i <= 1000; i++)
{
textBox1.Text = text.ToString();
}
}
和调用这些示例的方法
private void button1_Click(object sender, EventArgs e)
{
Thread th_1 = new Thread(WriteString);
Thread th_2 = new Thread(WriteString);
Thread th_3 = new Thread(WriteString);
Thread th_4 = new Thread(WriteString);
th_1.Priority = ThreadPriority.Highest;
th_2.Priority = ThreadPriority.BelowNormal;
th_3.Priority = ThreadPriority.Normal;
th_4.Priority = ThreadPriority.Lowest;
th_1.Start("1");
th_2.Start("2");
th_3.Start("3");
th_4.Start("4");
th_1.Join();
th_2.Join();
th_3.Join();
th_4.Join();
}
我在我的vs中分析过,我也是c#的新手。但我能推断的是:
程序1:Begin Invoke是异步调用方法的方式。因此,它最后只显示一个结果。如果你在VS中慢慢地做F11并观察,并不是每次你都得到结果4。但有时你也会得到3,当你按F11,并在某些地方一步一步(我的意思是延迟),由于多线程。您应该记住,多线程总是不会始终以相同的方式表现,这意味着假设多线程中的应用程序或模块一次给您一个结果,两次和10次,您不能确定它是正确的或优化的代码。因为在客户端环境中,由于其自身的行为,它可能会导致不同的结果,这些结果可能在调试时被忽视,或者甚至不会发生。我在一个不错的博客上读到的。
项目2:
由于它是多线程的,我可以看到不同线程在不同时间被调用的行为,当它完成这项工作时,我看到文本框在几秒钟内快速更新,这是人眼不可能注意到的,但最终结果是显示一个数字。当你使用F11进入每一行代码时,你会发现这种行为并很好地理解),并且你命令不要捕获它。这使得线程在第二种情况下一起工作。
这是我的推断,但我可以说,相当老土!我并不是很自信,这只是我的观察:)
让一些伟大的人加入他们的观点来帮助我们:)
欢呼