我估计啊,CPU占用率高是因为你把数据放到了UI了,UI大量刷新,所以CPU比较累。你试试先不放到UI上,再看看效果。遇到这种问题先尝试分解问题,然后逐个解决。一定要先找到瓶颈所在。

解决方案 »

  1.   

    你说的几秒自动读取一次,是从头读还是只读取新Log的内容?
    可以考虑单开一个线程,负责读取、处理数据,之后把结果传给UI,再由UI添加,可能会好些。
      

  2.   

    log 文件内容是追加进去吗? 如果是,当 StreamReader 读取完之后,记录下 StreamReader.BaseStream.Position 属性的值,下次读取时,把记录的值反赋回去,这样从上次的结束点开始读,不重复读之前的
      

  3.   

    同意,顶!!!
    另外文本读取的时候,如果效率低也要从代码上找找问题,如果能优化就有话,如果涉及到字符串拼接是不是要用stringbuilder,怎么减少循环次数等等都需要再考究。
      

  4.   

    每次读取几k到缓存,然后thread.sleep,操作完再读
      

  5.   


    我觉得这个做法不错,多谢,我回去试试,log文件的内容是追加进去的,是一个web系统不断向这里写日志,但我目前是每隔几秒完全重新读取一次,比较笨,,, ,等明天上班我按照你说的试试
      

  6.   

    我用的这个代码,16M的txt,大概是6秒        private void btnRead_Click(object sender, EventArgs e)
            {
                //HiPerfTimer hpt = new HiPerfTimer();
                //hpt.Start();            //线程每次读取文件100K 
                const long ChunkSize = 102400;
                //清理非托管不受GC控制的资源,using结束后会隐式的调用Disposable方法
                using (OpenFileDialog fbd = new OpenFileDialog())
                {
                    fbd.Filter = "文本文件|*.txt";
                    if (fbd.ShowDialog(this) == DialogResult.OK)
                    {
                        byte[] bytcontent = new byte[ChunkSize];
                        FileStream fs = new FileStream(fbd.FileName, FileMode.Open);
                        //获取文件总大小
                        long dataLengthToRead = fs.Length;                    while (dataLengthToRead > 0)
                        {
                            //读取的大小
                            int lengthRead = fs.Read(bytcontent, 0, Convert.ToInt32(ChunkSize));
                            Thread t = new Thread(new ParameterizedThreadStart(Readfile));
                            t.Start(System.Text.Encoding.Default.GetString(bytcontent));
                            dataLengthToRead -= lengthRead;
                        }
                    }
                }            //hpt.Stop();
                //MessageBox.Show((hpt.Duration/1000).ToString());
            }        public delegate void Callback(string str);        private void Readfile(object content)
            {
                if (richTextBox1.InvokeRequired)
                {
                    Callback call = new Callback(Readfile);
                    this.BeginInvoke(call, new object[] { content });
                }
                else
                {
                    this.richTextBox1.AppendText(content.ToString());
                    this.richTextBox1.AppendText("\r\n");
                }
            }