C# winform 加载大数据量界面假死.

lilei_new 2013-01-16 11:56:07
窗体Form

在Form中的Load事件中,开了一个后台线程,用于提取数据(大约3千多条).并绑定到CommBox1中用于展示.但总是在Form打开的时候,界面要卡死5秒钟才行.我现在怀疑是在绑定数据到commbox中占用了UI线程所至.我又尝试了让commbox.visible=false绑定完后再True.可是还会假死.各位大牛们有没有什么好办法?给小弟点解一下.
...全文
13040 90 打赏 收藏 转发到动态 举报
写回复
用AI写文章
90 条回复
切换为时间正序
请发表友善的回复…
发表回复
daving2010 2015-08-12
  • 打赏
  • 举报
回复
引用 39 楼 ruijc 的回复:
private AsyncOperation asyncOpr;
在窗体Load事件中初始化:
this.asyncOpr = AsyncOperationManager.CreateOperation(null);
对加载的数据使用Task异步类:

            Task.Factory.StartNew(() => this.读取数据()).ContinueWith(c =>
            {
                if (c.IsCompleted)
                {
                    this.asyncOpr.Post(obj =>
                    {
                      //在些将数据绑定到控件
                    }, null);
                }
                if (c.Exception != null)
                {
                    //异常处理
                    MessageBox.Show(c.Exception.Message);
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());
希望对你有所帮助。
这个简单易用,我并没有用this.asyncOpr = AsyncOperationManager.CreateOperation(null)这个有什么用?
shixinbao1 2013-04-17
  • 打赏
  • 举报
回复
delegate void BindComboxHandle(ComboBox cmb,int i); private void Form1_Load(object sender, EventArgs e) { BindComboxHandle bindCombox = Bind; var thread = new Thread(()=> { for (int i = 0; i < 30000; i++) { comboBox1.Invoke(bindCombox, comboBox1, i); } }) { IsBackground = true, Name = "绑定Combox" }; thread.Start(); } private static void Bind(ComboBox cmb,int i) { cmb.Items.Add(i); }
superchair 2013-01-29
  • 打赏
  • 举报
回复
引用 56 楼 lilei_new 的回复:
引用 55 楼 singlesai 的回复:3w条记录,好多人不理解,我理解,楼主是为了做检索,combo是可以输入时自动检索相似项的 理解万岁。
嗯,你可以这样,下拉菜单只有一项——请输入要查找的XXX,然后后台检索返回后添加进去。要知道后台的处理3W个数据简直就是几毫秒的事情!
lilei_new 2013-01-26
  • 打赏
  • 举报
回复
引用 83 楼 chinahuyong 的回复:
那就采用大数据量分页呀。 我的框架中有实现,千万条数据,一刷就出来了
加载的目的是为了检索,如果搞成分页会不会没加载的就检索不出来?
洳夢绚染 2013-01-25
  • 打赏
  • 举报
回复
保存到xml中提取吧 应该会快很多
lilei_new 2013-01-24
  • 打赏
  • 举报
回复
引用 81 楼 blue_apple2006 的回复:
引用 52 楼 yuwenge 的回复:3w条数据的combobox 楼主,要是我是用户,你在旁边,我直接抽你一嘴巴。 这玩意是给人用的么? 一脚T飞,30000条的combox糊弄鬼啊。你怎么不直接让我弄DB好了。
拜托不要人身攻击,也没办法.这个是上一任留下来的.计划将就着改改.
blue_apple2006 2013-01-24
  • 打赏
  • 举报
回复
引用 52 楼 yuwenge 的回复:
3w条数据的combobox 楼主,要是我是用户,你在旁边,我直接抽你一嘴巴。 这玩意是给人用的么?
一脚T飞,30000条的combox糊弄鬼啊。你怎么不直接让我弄DB好了。
oneatree 2013-01-24
  • 打赏
  • 举报
回复
多线程+委托,这样UI界面才不会卡
blwuer 2013-01-24
  • 打赏
  • 举报
回复
后台线程中查询完成数据后调用BeginInvoke异步的将数据绑定commbox不要用Invoke,Invoke是同步的所以会卡
cainiao_w 2013-01-24
  • 打赏
  • 举报
回复
每次显示100条,分批次
mabaolin 2013-01-24
  • 打赏
  • 举报
回复
考虑吧数据放到数组中,然后最后调用combobox.items.addrange,肯定会快。除非数据读取慢。
  • 打赏
  • 举报
回复
那就采用大数据量分页呀。 我的框架中有实现,千万条数据,一刷就出来了
worms1987 2013-01-23
  • 打赏
  • 举报
回复
别用.Add()加数据,用list<>直接赋上去试试
mmhoo 2013-01-23
  • 打赏
  • 举报
回复
lilei_new 2013-01-23
  • 打赏
  • 举报
回复
引用 76 楼 gzw13999 的回复:
大约3千多条 简单啊。我还以为3千万。
3万条.3万条.是3万条
gzw13999 2013-01-23
  • 打赏
  • 举报
回复
大约3千多条 简单啊。我还以为3千万。
yanguan55 2013-01-22
  • 打赏
  • 举报
回复
vssvss 2013-01-22
  • 打赏
  • 举报
回复
说了半天 你倒是贴点关键代码呀 要不然我们怎么知道你哪里错了
再来壹串 2013-01-22
  • 打赏
  • 举报
回复
用于提取数据(大约3千多条). 为啥很多人说3万条数据?why?
lovehong123 2013-01-22
  • 打赏
  • 举报
回复
引用 5 楼 lye2000000_super 的回复:
定义一个委托。在你的查询线程里查到数据后,调用invoke,在你定义的委托设置数据。这个应该不卡。 private delegate void SearchData(String data); Thread t = new Thread(new ThreadStart(test)); t.Start(); ……
我有一个数据同步工具,几万行数据要同步,还有很多嵌套的For循环,用了线程后就不假死了 Thread t = new Thread(new ThreadStart(test)); t.Start(); pubic void test(){这里是绑定commbox的方法} 希望能帮到你!
加载更多回复(67)

110,566

社区成员

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

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

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