【发布时间】:2013-03-22 20:28:55
【问题描述】:
我是 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();
}
【问题讨论】:
-
我一定错过了什么。这两个示例似乎都只会将单个数字写入文本字段(“1”、“2”、“3”或“4”),而不会从 0 到1000,也不会一次显示多个数字。除非它可能与从后台线程写入
Text属性的不一致行为有关? -
第二个示例通过直接从线程访问 GUI 元素来召唤 Cthulhu。使用 System.Console.WriteLine() 或类似方法来实际比较它们。
-
嗨@DasKrümelmonster!如何在 Win.Forms 应用程序中使用 System.Console.WriteLine()?
-
你试过了吗?默认情况下,VS 在右下窗格中显示输出。 (至少它对我有用,如果没有看到这里:stackoverflow.com/questions/5301232/…)
-
@goodspeed:你不能使用console.writeline(),正如类名所表明的那样,它只用于控制台应用程序。但是,Winforms 中的等效方法是使用 MessageBox.Show()。示例:Console.Writeline(resultString) as MessageBox.Show(Result: {0}", resultString)。
标签: c# multithreading