日期:2014-05-17  浏览次数:20962 次

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++)