2015-01-02 56 views
-1

我的项目使用BackgroundThread加载列表视图中的字符串hgh列表,它的性能非常快,但需要将近100%cpu有没有任何解决方法可以避免高CPU使用率性能?我用netframework 3.5如何避免阅读大文件时CPU使用率过高

代码:提前

 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)核心(TM)i3-2328M CPU @ 2.20GHZ 2.11 GHZ 安装的内存:1.00 GB 系统类型:32位操作系统系统

的文件有35939 KB大小与1个百万行

+0

什么是您的系统配置,您拥有多少个逻辑处理器? CPU保持100%的时间?文件有多大,包含多少行? –

+0

@SriramSakthivel @SriramSakthivel我不认为文件的大小很重要,所有重要的是它是巨大的:)但mysticgirltk,请写下你的系统配置,你的操作系统,操作系统和CPU的架构,内存大小和CPU时钟时间 – niceman

+0

@niceman巨大是一个广泛的术语。巨大的巨大?你能回答这个问题吗?可能不会。所以最好避免混淆我问文件大小。 –

回答

1

这不是异步:你仅仅使用一个不同的线程调用调用,并传递的代表将运行n个主( GUI)线程同步(因为控件绑定到创建它们的线程:主线程)。

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

  • 一个线程池线程

创建线程

  • 呼叫操作,它完成。

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

    但是,单个文件IO不太可能需要相当长的时间;然后在第一次运行后,它将被缓存在内存中,这样就减少了IO来分派内核调用的时间。

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

    您可能可以优化,但您需要从探查器数据开始,了解CPU时间的花费时间。


    如果文件上有高延迟或低带宽连接,通过网络共享存在也许它可能是不同的。

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

  • +0

    你说错了。 'read.BeginInvoke'是'Delegate.BeginInvoke'而不是'Control.BeginInvoke',因此代码不会在UI线程中执行,而会在'ThreadPool'中执行。 –

    +0

    @SriramSakthivel哎呀,是的。但它没有任何区别:如果它受CPU限制,它仍然是CPU限制的。 – Richard