【发布时间】:2021-04-20 15:50:08
【问题描述】:
Windows 窗体方法可能有什么问题。它由单独的非 UI 线程运行,但当我要添加 100 000 个树节点时,应用程序 UI 仍会冻结 10 秒。
private static void FillNodes(TreeView treeView, TreeNode[] nodes)
{
if (treeView.InvokeRequired)
{
Action<TreeView, TreeNode[]> action = FillNodes;
treeView.BeginInvoke(action, treeView, nodes);
}
else
{
treeView.SuspendLayout();
treeView.BeginUpdate();
treeView.Nodes.Clear();
treeView.Nodes.AddRange(nodes);
treeView.Sort();
treeView.EndUpdate();
treeView.ResumeLayout();
}
}
【问题讨论】:
-
treeView.BeginInvoke在 UI 线程上调用FillNodes。您要么需要确定用户正在查看哪些节点并仅绘制这些节点,要么需要virtualize yourtreeView。 -
向 TreeView 添加 100000 个节点会使 UI 线程太忙,无论您使用
Invoke还是BeginInvoke,因为它们也在运行/调度运行 UI 线程中的代码。就是这样。
标签: .net multithreading winforms user-interface c#-2.0