C#主界面卡的问题

秋山澪公主 2017-03-03 10:12:05
以下代码已经另开线程了,但是还是因为往主线程上的控件赋值的时候因为变量复杂庞大还是会卡住,有解决办法吗?
TreeNode treeNodeRoot = new TreeNode();
//另开一个线程计算得到treeNodeRoot ,但得到的treeNodeRoot很庞大
treeNodeRoot = Utility.TraverseJsonTree(jTree, treeNodeRoot);
treeView_result.Invoke(
new MethodInvoker
(
delegate
{
treeView_result.Nodes.Add(treeNodeRoot);//treeNodeRoot加到treeView_result上展示时会卡住界面主线程

}
));
...全文
405 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
得到的节点很多的话,可以做延迟加载,没必要一次性加载完。
「已注销」 2017-04-06
  • 打赏
  • 举报
回复
所有与界面相关的操作都放到ui线程,所有非ui的工作都放到单独的其他线程去完成,参考 http://www.cnblogs.com/zzfstudy/p/6193640.html
xuggzu 2017-03-04
  • 打赏
  • 举报
回复
treenoderoot太大影响时间,那就写个线程自己解析此node自己添加到tree
sp1234_maJia 2017-03-04
  • 打赏
  • 举报
回复
嗯,刚刚重新看了一下,上面代码中 var r = n.Nodes; n.Nodes.Clear(); 这里的 r 应该的意思是要对 n.Nodes 进行复制(产生另外一个 TreeNode 集合),因此少写了一两行语句!你自己理解就好。 这个例子只是说它比较复杂,不实际。而比较复杂不实际的根源,其实就是自以为比较技术化地搞“一次性产生了TreeRoot”造成的。
  • 打赏
  • 举报
回复
如果你一开始弄出了一个庞大的 Tree Root,然后再去“分步去加载”,你需要一个节点一个节点地加载(加载前先把你找到的数据节点的“子节点”先脱离原来的父子节点关系,然后判断当计数小于一定限制时就同步再加回原来的位置,否则就异步地把子节点。 我随便写一下大概意思(随便写的,只是一个示意)
public void 加载(TreeNodeCollection 数据, TreeNodeCollection 实际控件)
{
    加载(数据, 实际控件, 0);
}

public int 加载(TreeNodeCollection 数据, TreeNodeCollection 实际控件, int index)
{
    foreach (TreeNode n in 数据)
    {
        var r = n.Nodes;
        n.Nodes.Clear();
        实际控件.Add(n);
        index++;
        if (index <= 30)
            index = 加载(r, n.Nodes, index);     //把r加载到n下边
        else        //如果大于30步则异步加载
            ThreadPool.QueueUserWorkItem(h =>
            {
                this.BeginInvoke((Action)delegate
                {
                    加载(r, n.Nodes, 0);      //把r加载到n下边,index从0开始计数
                });
            });
    }
    return index;
}
你可以清晰地看到,实际上想当然地“另开一个线程计算得到庞大的 treeNodeRoot”好像挺高大上似地,好像很技术化似地,其实它一点也不技术。单纯技术化是很幼稚的,它反而造成你不得不写出非常复杂、诡异的后续代码。 而如果你稍微动脑筋、用心设计一个“事件驱动”模型,你只需要得到2层节点的 treeNodeRoot,然后在加入节点时动态注册监听其 Expand 事件,在事件中再去判断对于当前 第 n 层节点是否需要加载第 n+2层子节点,只要这样离散地把数据模型插入用户交互细节中,你的“计算子节点”的业务逻辑是细节的、小的,你的程序的用户体验是好的、流畅的。而且代码写起来也很简单,比上面的这个要容易理解多了。
  • 打赏
  • 举报
回复
处理用户体验问题,一定要变通,千万不要死守一些初学的技术。从自然出发越简单极致才越会有好的用户体验。 它可比你知道的技术知识更丰富,更有创意,更重要。
  • 打赏
  • 举报
回复
引用 楼主 Kel_Thuzad 的回复:
但得到的treeNodeRoot很庞大 treeNodeRoot = Utility.TraverseJsonTree(jTree, treeNodeRoot); treeView_result.Invoke( new MethodInvoker ( delegate { treeView_result.Nodes.Add(treeNodeRoot);//treeNodeRoot加到treeView_result上展示时会卡住界面主线程 } ));
要让主线程(显得)“流畅”,至少有两个方面要去做。第一就是牺牲性能而提高流畅的用户体验,实际上加载时间长了但是用户通常反而感觉比较流程,那么就要每当加载一部分(比如说20个 treeNode 之后)就把剩下的加载异步地注册到下一个 Control.BeginInvoke 回调中去处理。这时候就要有点“悟性”,要知道牺牲性能换来用户体验,要辩证地搞清楚目的而不要空谈技术。 第二,更多但更通用的情况其实是复杂一点,也就是只计算和1、2层 Nodes(而你说你一次性计算了整个树,这对于大数据来说更是空谈),然后在树上只加载2层。此时界面上自然只展示一层。当用界面操作展开第一层,在这个“展开”事件中才动态加载被展开的节点下的第三层,当用户在界面上展开某个第2层节点时才动态加载它下面的第4层节点..........这样的设计是基于事件驱动的,是离散的。客观上,实际上它跟上面第一点有本质的相同的地方,就是加载时都是离散的。但是这就更将离散推入实际深处,根本摒弃了想当然的什么“一次性计算得到树”了。 你会看到,空洞地搞技术、一次性得到树,其实是问题的根源。反而有些人会自己为很懂技术,其实真正的技术是要重构,要反技术,才能改进技术。
threenewbee 2017-03-03
  • 打赏
  • 举报
回复
treeView_result.Nodes.Add(treeNodeRoot);
如果性能耗在这里,那么多线程也没用,你可以隐藏下treeview,等更新完显示
或者在你的循环中加入application.doevents() 接收消息,避免卡住
水哥阿乐 2017-03-03
  • 打赏
  • 举报
回复
性能是个无止境的话题,值类型和址类型也同样是个矛盾,一个是耗内存,一个是耗CPU, webserver webfrom winform 数据层 xml sql xsd............. 框架基类 IO,集合,字符 .... CLR 元数据 IL system 另外不知道你是否记得上面的net基础,不要轻易动界面层,越到底层效率越高,号称软件界的爱因思坦比尔乔伊曾高度评价过XML是计算界最伟大的发明之一,对tree结构最好的表现莫过于xml,所以建议你先将取得的树结构存成XML. 以后要用时随用随取,既然你卡在树上,那么你应该在树上解决
项目名称:[精仿]360安全卫士-10.30更新(CSkin Demo) 界面库版本号:10.30 最新版本 下载内容: 精仿360安全卫士源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360安全卫士界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360。 5.自定义控件的美化使用。 界面库更新文档: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 小编:下载不要分,DEMO教你如何熟练使用CSkin界面库美化自己的窗体。 友情链接: http://bbs.csdn.net/topics/390510544 (精仿QQ2013局域通讯) http://download.csdn.net/detail/lyx_520/5710799 (C#实现Win8窗体)
项目名称:高仿QQ2013通讯DEMO-10.30更新 版本号:10.30 最新版本 下载内容: (C#)CC2013局域网通讯源码一份, 可引用至工具箱最新版CSkin.dll-10.30版本界面库一份。 界面库更新说明: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 实现功能: 1.界面库中多达25个自定义换肤控件,让每个控件设设属性就能达到你想要的效果,支持图片换肤和色调绘制。 2.四边阴影,毛边效果,可以设置阴影宽度和阴影颜色,支持所有系统。 3.拥有密码键盘输入,防护更贴心。 4.8种圆角窗体模式供你选择,淋漓尽致,润滑如圆。 5.登录界面后,有登陆提示窗,提示上次登录的城市和时间。 6.皮肤随心变:拖动任意一张图片至界面,就可以改变皮肤。 7.皮肤色调获取:改变皮肤的同时,将计算图片色调,再将其运用到窗体背景色。 8.皮肤尾部渐变:上下左右方均可实现,渐变皮肤。 9.皮肤拖拉方向:可以选择皮肤在拉伸的时候,粘着哪一边拖拉。 10.GDI+界面重绘,处理消息机制,3种移动模式和拉伸是否启用只需要设置一个属性的事就可以解决。 11.界面渐变闪现和闪退:不再像平凡的突然出现,采用API渐变机制,渐渐出现和消失,win7系统下还有动态缩小至任务的效果。 12.完美好友列表,可添加上千好友,不不掉线,还可以拖动好友到其他分组。 13.好友悬浮至头像可以查看详细资料。 14.窗口可调渐变后透明度:让窗体看起来更像是Vista玻璃窗体风格。 15.聊天窗口可发送图片,大文件,表情,还有震动。 16.按钮控件背景色拥有继承窗体背景色调的功能,让整体色调保持一致。 17.更是有和如出一辙的扣扣截图。仿真度也达到100%,完美修复所有已知BUG。 18.聊天窗口,可以调字体颜色和字体样式等多项功能。 20.SkinLabel与SkinButton控件字体与窗体标题可以根据背景色暗亮度自动调节字体为黑还是白。 21.MessageBox提示框的美化,并继承调用窗口的色调与背景,MessageBox可所谓已达到帅气的不能再帅气的境界了。 22.天气皮肤自动变,所有窗体根据当地天气自动决定皮肤背景,CC最帅气功能之一。 23.个人资料及聊天窗体拥有动态CC秀展示。 24.界面拖动换肤的同时,所关联的子窗体皮肤也会跟着变。 25.多线程大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.界面库已封装了大图取色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录。 界面库交流群:306485590 本人QQ:345015918 注意: Demo版不包括更新,为方便用户查看和使用属性等方法,dll只轻微加密。想反编译的就不要尝试了,里面有上百个类,改错改到你哭。 介意购买正版,永久更新配源码。 看截图或者想购买商业版的用户请访问以下地址: http://www.51aspx.com/code/TotalLikeQQ2013 特权:购买商业版的用户,有权利享有最快的更新服务,第一时间将最新版本的dll源码送到你手上。 使本项目源码或本项目生成的DLL前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利。 1、你可以在开发的软件产品中使用和修改本项目的源码和DLL,但是请保留所有相关的版权信息。 2、不能将本项目源码与作者的其他项目整合作为一个单独的软件售卖给他人使用。 3、不能传播本项目的源码和DLL,包括上传到网上、拷贝给他人等方式。 4、以上协议暂时定制,由于还不完善,作者保留以后修改协议的权利。 时间:2013-7-5 作者: 乔克斯 请保留以上版权信息,否则作者将保留追究法律责任。

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧