请查看我的每个标签的解决方案是否有效

时间:2014-08-11 06:00:03

标签: c# multithreading tabpage

我想完成的是:用户可以动态创建一个标签页,并且对于每个标签页,它将包含一个相应的线程做起作用。

我所做的是:

1:在主窗口"创建标签页"按钮,添加以下代码:

        currentUserControl = new everyTabPage();   
        TabPage tp = new TabPage();
        tp.Name = "a";
        tp.Controls.Add(currentUserControl);
        currentUserControl.Dock = DockStyle.Fill;
        tabControl1.TabPages.Add(tp);

everyTabPage是一个像这张图片的用户控件

enter image description here

2:在这个userControl"开始"按钮,添加

        Thread tM = new Thread(new ParameterizedThreadStart(ThreadFunc));
        tM.IsBackground = true;
        tM.Start(comboBox1.Text);

这是线程函数,对于测试,我只更改标签的文本。

    public void ThreadFunc(object param)
    {
        string SessionParameter = (string)param;

        while (true)
        {
            this.Invoke((MethodInvoker)delegate()
            {
                label1.Text = DateTime.Now.ToString() + @"_" + SessionParameter;
            });

        }
    }

3:完成这些后,现在程序看起来像我想要的那样工作。

但是当我测试它时,我发现如果我创建了三个以上的标签,程序的速度会变得非常慢。

现在考虑我只更改标签的文字,它已经很慢了,如果我真的做一些商业工作,速度是不可接受的。

任何人都可以告诉我为什么速度如此之慢,或者如果我的解决方案无效,谢谢。

2 个答案:

答案 0 :(得分:1)

虽然ThreadFunc在一个单独的线程上运行Invoke,但是Timer在UI线程上执行了所有线程的所有工作,所以你会在UI线程中充满消息,它很慢没有完成任何工作。

你的程序真的需要在那个紧凑的循环中更新UI吗?一个更好的选择可能是使用public void ThreadFunc(object param) { string SessionParameter = (string)param; while (true) { this.Invoke((MethodInvoker)delegate() { label1.Text = DateTime.Now.ToString() + @"_" + SessionParameter; }); Thread.Sleep(250); } } ,而是在计时器已用事件上进行更新。

另一个快速修复而不是使用计时器会在循环中进入睡眠状态。

{{1}}

现在,您的用户界面将每秒更新4次,而不是每秒400,000次。

答案 1 :(得分:0)

你真的需要

吗?
while(true)

我认为如果您只想设置标签文本,那么您不需要它。

while(true)

需要大量的CPU时间,例如