日期:2014-05-16  浏览次数:20820 次

backgroundWorker加载数据的时候CPU占用过高


private BackgroundWorker search = new BackgroundWorker();
private void searchKey(object sender, EventArgs e)
{
    this.listView.Items.Clear();
    this.listView.BeginUpdate();
    this.search.RunWorkerAsync();
}
private void searchKey(object sender, DoWorkEventArgs e)
{
    /*这里是一些查询步骤省略,下面用一个FOR来说明一下我查询到很多结果*/
    for(int i=0;i<2000;i++)/*现在我的问题结果数量越大,越会卡的时间长*/
    {
        string[] list = new string[6];
        list[0]="a";
        list[1]="b";
        list[2]="c";
        list[3]="d";
        list[4]="e";
        list[5]="f";
        this.search.ReportProgress(i, list);
    }
}
private void search_DoWork(object sender, DoWorkEventArgs e)
{
   searchKey(sender, e);
}
private void search_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    string[] list = e.UserState as string[];
    ListViewItem lv = new ListViewItem(new string[] { list[1], list[2], list[3], list[4] });
    lv.ImageKey = list[0];
    lv.Tag = list[5];
    this.listView.Items.Add(lv);
}
private void search_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    this.listView.EndUpdate();
}
我的程序结构就是这样的,如果查询的结果数量不多(几十条结果)时,就很快加载完毕,但是结果数量很多(结果数量在几百条)时,就会出现界面卡死,任务管理器显示CPU达到50%,而且要过很久才会加载完毕显示正常。
请问一下是我的结果有问题还是什么情况?
------解决方案--------------------
楼主

引用:
Quote: 引用:

处理的数据多自然就要耗费更多的资源,楼主是在考验我们的智商嘛
没有这种意思,是真心不懂,这个控件的作用不就是另起线程工作,让界面不会“死掉”的么?
另外我自己找资料后有人指出说更新UI速度太快的原因,都在更新UI前加上Thread(10)延时,这样我关注了一下CPU占用率确实能降低,而且睡眠时间越长CPU占用率越低,只是时间总的运行时间更长了并且界面还是一样“死掉”


其实楼主你这里并不需要报告进度,而且在报告进度的方法里处理数据的做法是不合理的
DoWork方法把所有的数据处理好,然后在RunWorkerCompleted时候更新数据,这时候才使用
BeginUpdate和EndUpdate避免更新的时候控件闪烁
------解决方案--------------------
不要在 search_ProgressChanged 进行复杂的 UI 操作。如果一定需要显示,那么你可以每100条记录才显示一次,或者没当过了3秒钟才显示。
------解决方案--------------------
用法错误,先循环,每步循环去异步执行
全局量:
string[] list = new string[6];
int num = 0;

searchKey:
for(int i=0;i<2000;i++)
{   
    num = i;  
    search.RunWorkerAsync();
}

search_DoWork:
e.Result = searchKey(search,e);

searchKey: 
list[0]="a";
list[1]="b";
list[2]="c";
list[3]="d";
list[4]="e";
list[5]="f";
return "ok";

RunWorkerCompleted:
string rt = e.Result