如何在读取大文件时避免高CPU使用率

时间:2015-01-02 13:10:34

标签: c# listview asynchronous foreach large-data

我的项目使用BackgroundThread将chgh list of string加载到listview中,它的性能非常快但是需要几乎100%的cpu是否有任何解决方法可以避免高CPU使用而不降低性能?我使用netframework 3.5

代码:

        void readfile() {

        deg_readfile read = new deg_readfile(readfileasync);
        read.BeginInvoke(new AsyncCallback(callback),null);
    }

    void readfileasync(){
        string[] strs = File.ReadAllLines("hughlist.txt");
        List<ListViewItem> _itemlst = new List<ListViewItem>();
        ListViewItem _item;
        int x = 0;
        //problem start here
        foreach (string str in strs) {
            _item = new ListViewItem(str);

            for (int i = 0; i < 6; i++) {
                _item.SubItems.Add("");              
            }              
            _itemlst.Add(_item);
            x++;
            _item = null;
        }
    }

    void callback(IAsyncResult ae) {
        Console.WriteLine("finished");

    }

    delegate void deg_readfile();

    static void Main(string[] args)
    {
        Program prog = new Program();

        Thread t=new Thread(new ThreadStart(prog.readfile))
        {
            IsBackground = true,
            Priority = ThreadPriority.Lowest

        };
        t.SetApartmentState(ApartmentState.MTA);
        t.Start();
        Console.Read();

    }

提前致谢。

更新

系统配置:

处理器:Intel(R)Core(TM)i3-2328M CPU @ 2.20GHZ 2.11 GHZ 安装内存:1.00 GB 系统类型:32位操作系统

该文件大小为35,939 KB,行数为1百万

1 个答案:

答案 0 :(得分:1)

这不是异步的:你只是使用不同的线程来调用invoke,并且传递的委托将同步在主(GUI)线程中运行(因为控件与创建它们的线程相关联:主线程)

所以工作线程做了两件事:

  • 创建主题
  • 在线程池线程上调用操作

已经完成了。

线程池线程完成所有工作,包括同步读取文件。 2

但是, 1 不太可能单个文件IO占用大量时间;然后在第一次运行后,它将被缓存在内存中,从而减少IO以分配内核调用。

但是异步执行操作不会减少所需的CPU资源量(有可能 - 设置数据结构以跟踪事物 - 它将需要更多):您的CPU将参与处理文件的内容。

您可以优化它,但是您需要从分析器数据开始,以了解CPU时间的消耗。


1 如果文件存在于具有高延迟或低带宽连接的网络共享上,则可能会有所不同。

2 严格地说,在线程池线程上执行阻塞操作(它们不可用于其他活动)是不好的形式,但不太可能是文件IO的问题。 (见前面的脚注。)