我想完成的是:用户可以动态创建一个标签页,并且对于每个标签页,它将包含一个相应的线程做起作用。
我所做的是:
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:完成这些后,现在程序看起来像我想要的那样工作。
但是当我测试它时,我发现如果我创建了三个以上的标签,程序的速度会变得非常慢。
现在考虑我只更改标签的文字,它已经很慢了,如果我真的做一些商业工作,速度是不可接受的。
任何人都可以告诉我为什么速度如此之慢,或者如果我的解决方案无效,谢谢。
答案 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时间,例如