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

backgroundWorker与ListView疑义

2013-12-04 
backgroundWorker与ListView疑问private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e

backgroundWorker与ListView疑问


        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Invoke((MethodInvoker)delegate
            {
                this.listView.BeginUpdate();
                this.listView.Items.Clear();
                //...查询数据库的过程
                //...很多查询记录,并将记录列出到表中
                this.listView.EndUpdate();
            });
        }

为什么这一个过程程序界面还是会卡住呢?不是在后台进程中进行的吗? backgroundWorker ListView
[解决办法]
你应该把耗时的操作放在线程中,而不是Invoke中,Invoke只放和UI刷新有关的操作。
[解决办法]
引用:
另外,好像backgroundWorker_DoWork是算是线程中执行费时的操作吧?那要在什么时候怎么样把数据列到ListView中去呢?迷糊了

backgroundWorker_DoWork是一个线程,但是你在使用Invoke的时候,是将Invoke中代码交给UI主线程来执行,所以会卡,所以你要将费时跟UI不想关的代码写在Invoke以外的地方,而跟UI相关的写在Invoke中(跟UI相关的操作要交给UI主线程来操作)
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

另外,好像backgroundWorker_DoWork是算是线程中执行费时的操作吧?那要在什么时候怎么样把数据列到ListView中去呢?迷糊了

backgroundWorker_DoWork是一个线程,但是你在使用Invoke的时候,是将Invoke中代码交给UI主线程来执行,所以会卡,所以你要将费时跟UI不想关的代码写在Invoke以外的地方,而跟UI相关的写在Invoke中(跟UI相关的操作要交给UI主线程来操作)
您好,backgroundWorker_DoWork是不是只是查询数据并储存到定义的数组中,然后在外部将数组中的数据再次填到ListView中?不太懂,能不能帮我写一下你们的习惯格式?

并不是你所说的这样,backgroundWorker能够完成所有的工作:

 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //...查询数据库的过程
            //...很多查询记录,并将记录列出到表中
            this.Invoke((MethodInvoker)delegate
            {
                this.listView.BeginUpdate();
                this.listView.Items.Clear();
                //循环添加记录:listView.Items.Add()
                this.listView.EndUpdate();
            });
        }

[解决办法]
读100条再invoke一次,别每次都invoke就行了
[解决办法]
不知道你用没有用数据绑定哦,你是查询数据出来,直接加到Listview里面,一条一条加吗?
如果是这样,建议你先运用数据绑定,这样可以把UI刷新和修改数据分开来
然后,只要把修改数据内容(包括查询数据)的操作放在非UI线程就好了,就是在你的DoWork里面,只要不操作UI,就不要用Invoke。
如果,还是嫌整个添加数据的过程太慢,就加进度条提示用户嘛。

热点排行