c#读取大容量txt文件,如何降低cpu利用率 我估计啊,CPU占用率高是因为你把数据放到了UI了,UI大量刷新,所以CPU比较累。你试试先不放到UI上,再看看效果。遇到这种问题先尝试分解问题,然后逐个解决。一定要先找到瓶颈所在。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你说的几秒自动读取一次,是从头读还是只读取新Log的内容?可以考虑单开一个线程,负责读取、处理数据,之后把结果传给UI,再由UI添加,可能会好些。 log 文件内容是追加进去吗? 如果是,当 StreamReader 读取完之后,记录下 StreamReader.BaseStream.Position 属性的值,下次读取时,把记录的值反赋回去,这样从上次的结束点开始读,不重复读之前的 同意,顶!!!另外文本读取的时候,如果效率低也要从代码上找找问题,如果能优化就有话,如果涉及到字符串拼接是不是要用stringbuilder,怎么减少循环次数等等都需要再考究。 每次读取几k到缓存,然后thread.sleep,操作完再读 我觉得这个做法不错,多谢,我回去试试,log文件的内容是追加进去的,是一个web系统不断向这里写日志,但我目前是每隔几秒完全重新读取一次,比较笨,,, ,等明天上班我按照你说的试试 我用的这个代码,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"); } } 音乐播放器 浩方对战平台类似的平台是怎么做的?用C#能完成吗 c# 如何通过xml进行交互? winform中关于2个窗体之间的新手问题!! 急!关于XML Web Service的异步通讯回调方法的问题 学过SharpDevelop的热心人请进来 再次询问: 怎样使用crystalReportViewer实现直接打印,操作打印机参数和纸张大小参数? 没有人知道嘛?100分奉上 16进制转换为10进制 动态设置dataGridView的列宽问题,急... 停车场管理系统 b/s c/s socket keep alive问题 gridview的PagerTemplate 不显示内容
可以考虑单开一个线程,负责读取、处理数据,之后把结果传给UI,再由UI添加,可能会好些。
另外文本读取的时候,如果效率低也要从代码上找找问题,如果能优化就有话,如果涉及到字符串拼接是不是要用stringbuilder,怎么减少循环次数等等都需要再考究。
我觉得这个做法不错,多谢,我回去试试,log文件的内容是追加进去的,是一个web系统不断向这里写日志,但我目前是每隔几秒完全重新读取一次,比较笨,,, ,等明天上班我按照你说的试试
{
//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");
}
}