具有文本框控件的多线程

时间:2013-03-22 20:28:56

标签: c# multithreading

我是C#的初学者。我不明白为什么接下来的两个例子会给出不同的结果。我在msdn中使用了microsoft示例。在第一个示例中,它在文本框中显示一个数字。在第二个示例中,它显示每个线程的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 个答案:

答案 0 :(得分:1)

我在VS中分析过。我也是C#的新手。但我可以推断的是:

计划1:

Begin Invoke是一种调用方法的不同步方式。因此,它最后只显示了一个结果。如果你在VS中慢慢做了F11并观察,并不是每次都得到结果4.但是当你做F11并且某些地方一步一步(我的意思是延迟)时,由于多线程,你也会得到3。你应该记住,多线程总是永远不会以相同的方式运行,这意味着假设多线程中的应用程序或模块一次给你一个结果,两次和10次,你不能确定它是正确的或优化的代码。因为在客户端环境中,由于它自己的行为,它可能导致不同的结果,这些结果在调试时可能会被忽视,或者甚至不会发生。我在一个不错的博客中看到它。

计划2:

由于它的多线程,我可以看到不同线程的行为在不同时间被调用,并且当它完成工作时,我看到文本框在几分之一秒内快速更新,这是人眼无法注意到的,但最终结果显示一个数字。你也检查交叉线程调用)当你使用F11进入每一行代码时,你会发现这种行为并且理解得很好)并且你命令不要捕获它。这使得线程在第二种情况下一起工作。

这是我的推论,但我可以说,非常老套!我不自信地声称这个,但只是我的观察:)

让一些伟大的人们用自己的观点来帮助我们:)

干杯