var form = new MyForm(someargs);
//400 ms
form.ShowDialog();
...
private void myForm_Load(object sender, EventArgs e)
{
//4500 ms since form.ShowDialog() on Windows 2016
}
从form.ShowDialog()
启动到Load事件处理程序myForm_Load
升高之间的时间:
硬件:
MyForm的结构为:
TableLayoutPanel
与Dock==DockStyle.Fill
。它大约有十个TextBox
,ComboBox
,Label
等。还有两个Button
,一个TabControl
和一个DataGridView
。还有我派生的UserControl的两个实例。
MyForm的DoubleBuffered
属性设置为true
。我尝试了false
,但是速度却没有提高。
花费这么多时间?我还能尝试什么?
事件处理程序的代码已使用我自己的基于StopWatch的探查器进行了探查。然后我知道暂停包含两个部分。每当它出现在MyUserControl.SelectedValue
设置程序调用之前。可能很重要,SelectedValue
是MyUserControl
类与[System.ComponentModel.DefaultBindingProperty("SelectedValue")]
此外,我知道是否同时删除两个UserControl实例,MyForm将很快显示。 但是,我不知道究竟花了这么多时间。
我找到了“犯罪者” 。它是ComboBox
,在DataSource中具有大量项目。目前,我可以展示MCVE:
...
private void button1_Click(object sender, EventArgs e)
{
var form = new MyForm(); // 76ms 2008R2; 123ms 2016
form.ShowDialog(); //1820ms 2008R2;12440ms 2016
}
}
public class MyForm : Form
{
private readonly ComboBox myComboBox = new ComboBox();
public MyForm()
{
var manyItems = Enumerable.Range(1, 66_000)
.Select(t => new
{
Key = t,
Value1 = t.ToString(),
Value2 = t.ToString() + t.ToString()
})
.ToList();
myComboBox.DataSource = manyItems;
myComboBox.ValueMember = "Key";
myComboBox.DisplayMember = "Value2";
this.Controls.Add(myComboBox);
}
}