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);
});
}
试试,我这还行。
[解决办法]
那就采用大数据量分页呀。
我的框架中有实现,千万条数据,一刷就出来了
[解决办法]
嗯,你可以这样,下拉菜单只有一项——请输入要查找的XXX,然后后台检索返回后添加进去。要知道后台的处理3W个数据简直就是几毫秒的事情!