Rob*_*Rob 2 c# performance menu winforms
我在我的应用程序中构建一些动态上下文菜单,代码如下:
mi = new ToolStripMenuItem( caption ) { Tag = c, Enabled = true };
context_menu.Items.Insert( n, mi );
mi.Click += new EventHandler( ContextClick);
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果项目数量很大(比如1000),则构建菜单可能需要几分钟.我意识到菜单中的1000个项目是不寻常的,但这里的问题是速度.对于组合框和列表框,有一个BeginUpdate()/ EndUpdate()可以放在这种操作中.菜单有机制吗?
"类似"代码在VB6项目中运行,执行操作所需的时间不到10秒.
使用context_menu.Items.CopyTo方法将当前菜单复制到缓冲区.然后使用context_menu.Items.Clear()清除当前集合.根据需要更新缓冲区(不触发UI更新),然后使用AddRange(缓冲区)将它们放回原处.
示例代码:
Stopwatch sw = new Stopwatch();
sw.Start();
var items = new ToolStripItem[menuStrip1.Items.Count];
menuStrip1.Items.CopyTo(items, 0);
var itemList = new List<ToolStripItem>(items);
for (int i = 0; i < 1000; i++)
itemList.Insert(2, new ToolStripMenuItem { Text = "Hello" + i.ToString() });
menuStrip1.Items.Clear();
menuStrip1.Items.AddRange(itemList.ToArray());
sw.Stop();
label1.Text = sw.ElapsedMilliseconds.ToString();
Run Code Online (Sandbox Code Playgroud)
我的邋machine机器上47毫秒.