最近在项目开发中,遇到一个问题,读取文件中几十万条数据进行读取加载,导致页面响应卡顿,等待时间长,进行了代码处理:
private void ConvertStrListToModelList(List<string> strList)
{
strList.AsParallel().ForAll(line => {
//Check for header row
if (line.StartsWith("UtcTimestamp") == true)
return;
if (fileName.EndsWith(".csv", StringComparison.OrdinalIgnoreCase) == true) //针对本地文件
{
string[] strLine = line.Split(',');
if (strLine.Length >= 5)
{
if (strLine[0].Trim().ToUpper().Equals("TIME") && strLine[1].Trim().ToUpper().Equals("TYPE"))
{
return;
}
LoggingMessage mdoelMessage = new LoggingMessage();
mdoelMessage.Time = strLine[0].Trim();
mdoelMessage.Type = strLine[1].Trim();
mdoelMessage.SourceProcess = strLine[2].Trim();
mdoelMessage.Source = strLine[3].Trim();
mdoelMessage.Message = strLine[4].Trim();
LoadLoggingList.Add(mdoelMessage);
}
}
else //针对服务器文件
{
LogMessage logM = new LogMessage();
if (logM.TryParse(line))
{
LoggingMessage mdoelMessage = new LoggingMessage();
//DateTime dt = DateTime.FromFileTimeUtc(logM.UtcTimestamp);
//DateTime tempDateTime = dt.ToLocalTime();
//mdoelMessage.Time = tempDateTime.ToString(timeFormat);
mdoelMessage.Time = logM.UtcTimestampAsString.Replace("T", " ").Replace("+08:00", "").Trim(); //2022-07-10T15:27:12.018+08:00
mdoelMessage.Type = logM.Type;
mdoelMessage.SourceProcess = logM.SourceProcess;
mdoelMessage.Source = logM.Source??"";
mdoelMessage.Message = logM.Message;
LoadLoggingList.Add(mdoelMessage);
}
}
});
}
之前代码:
foreach (var item in addFilesModelList)
{
FilesModelList.Add(item);
}
核心在strList.AsParallel().ForAll。其中使用并行方式增加CPU使用率,而且多线程读取文件,极大的提升了性能。
多线程提升程序性能主要是对一些计算密集型代码进行处理:
1.将代码划分未块
2.通过多线程并发进行处理代码块
3.结果变为安全后,以线程安全和高性能进行整合这些结果
并行就可以处理以上情况。