首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-04-20 
C# winform 加载大数据量界面假死.窗体Form在Form中的Load事件中,开了一个后台线程,用于提取数据(大约3千

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

在Form中的Load事件中,开了一个后台线程,用于提取数据(大约3千多条).并绑定到CommBox1中用于展示.但总是在Form打开的时候,界面要卡死5秒钟才行.我现在怀疑是在绑定数据到commbox中占用了UI线程所至.我又尝试了让commbox.visible=false绑定完后再True.可是还会假死.各位大牛们有没有什么好办法?给小弟点解一下. 界面假死 加载大数据量
[解决办法]

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());

希望对你有所帮助。

[解决办法]
隐藏起来,然后处理一样是做UI处理阿,没有什么区别,用多线程,可以考虑延后加载,用户点了ComboBox再显示加载界面,让用户等等,加载晚了隐藏加载界面,也就第一次,后面就不需要了,5秒在忍受范围了。。。
[解决办法]
在循环过程中响应下消息就不会假死了,给段C++代码

MSG msg;
while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE) ) {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
 }

[解决办法]

        private void Form1_Load(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem((o) => {
                ComboBox cbb = new ComboBox();
                for (int i = 0; i < 30000; i++)


                {
                    cbb.Items.Add(i);
                }
                this.Invoke(new Action<ComboBox>((cb) => {
                    this.Controls.Add(cb);
                }),cbb);
            });
        }


试试,我这还行。
[解决办法]
那就采用大数据量分页呀。

我的框架中有实现,千万条数据,一刷就出来了
[解决办法]
引用:
引用:3w条记录,好多人不理解,我理解,楼主是为了做检索,combo是可以输入时自动检索相似项的

理解万岁。


嗯,你可以这样,下拉菜单只有一项——请输入要查找的XXX,然后后台检索返回后添加进去。要知道后台的处理3W个数据简直就是几毫秒的事情!

热点排行