C# 请查看我针对每个选项卡的解决方案线程是否有效

C# 请查看我针对每个选项卡的解决方案线程是否有效,c#,multithreading,tabpage,C#,Multithreading,Tabpage,我想完成的是:用户可以动态创建一个标签页,并且对于每个标签页,它将包含一个对应的线程做工作 我所做的是: 1:在主窗口的“创建选项卡页面”按钮中,添加以下代码: currentUserControl = new everyTabPage(); TabPage tp = new TabPage(); tp.Name = "a"; tp.Controls.Add(currentUserControl); curre

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

我所做的是:

1:在主窗口的“创建选项卡页面”按钮中,添加以下代码:

        currentUserControl = new everyTabPage();   
        TabPage tp = new TabPage();
        tp.Name = "a";
        tp.Controls.Add(currentUserControl);
        currentUserControl.Dock = DockStyle.Fill;
        tabControl1.TabPages.Add(tp);
everyTabPage是一个类似于此图片的用户控件

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:做了这些之后,现在这个程序看起来像我想要的那样工作

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

考虑到现在我只更改标签的文本,它已经很慢了,如果我真的做一些业务工作,速度将无法接受


谁能告诉我为什么速度这么慢,或者如果我的解决方案无效,谢谢。

这很慢,因为尽管
ThreadFunc
在一个单独的线程上运行,而
Invoke
您执行的是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);
    }
}
现在,您的UI将每秒更新4次,而不是400000次。

您真的需要

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

while(true)

需要大量的CPU时间,例如

我知道了,你说得对。更新如此频繁并不必要
线程的使用极其糟糕
为了小狗的爱,请使用
定时器
。嗨,如果我想当用户在usercontrol中选择组合框内容时,添加的选项卡页的标题将自动更改为所选内容,并闪烁选项卡页,你能告诉我怎么做吗?