C# 请查看我针对每个选项卡的解决方案线程是否有效
我想完成的是:用户可以动态创建一个标签页,并且对于每个标签页,它将包含一个对应的线程做工作 我所做的是: 1:在主窗口的“创建选项卡页面”按钮中,添加以下代码:C# 请查看我针对每个选项卡的解决方案线程是否有效,c#,multithreading,tabpage,C#,Multithreading,Tabpage,我想完成的是:用户可以动态创建一个标签页,并且对于每个标签页,它将包含一个对应的线程做工作 我所做的是: 1:在主窗口的“创建选项卡页面”按钮中,添加以下代码: currentUserControl = new everyTabPage(); TabPage tp = new TabPage(); tp.Name = "a"; tp.Controls.Add(currentUserControl); curre
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中选择组合框内容时,添加的选项卡页的标题将自动更改为所选内容,并闪烁选项卡页,你能告诉我怎么做吗?