100多行代码实现6秒实现50万条四线程并发日志文件写入,下载文件

下载文件:

100多行代码实现6秒完成50万条多线程并发日志文件写入,50万日志文件

100多行代码实现6秒完成50万条多线程并发日志文件写入,支持日志文件分隔

日志工具类代码:

图片 1using
System; using System.Collections.Concurrent; using
System.Collections.Generic; using System.IO; using System.Linq; using
System.Text; using System.Threading; using System.Threading.Tasks;
namespace Utils { /// <summary> /// 写日志类 /// </summary>
public class LogUtil { #region 字段 public static object _lock = new
object(); public static string path = “D:\log”; public static int
fileSize = 10 * 1024 * 1024; //日志分隔文件大小 private static
ConcurrentQueue<Tuple<string, string>> msgQueue = new
ConcurrentQueue<Tuple<string, string>>(); #endregion
#region 静态构造函数 static LogUtil() { Thread thread = new Thread(new
ThreadStart(() => { try { int i; List<string> list;
Tuple<string, string> tuple; while (true) { i = 0; list = new
List<string>(); while (msgQueue.TryDequeue(out tuple) && i++ <
10000) { list.Add(tuple.Item1.PadLeft(8) + tuple.Item2); } if
(list.Count > 0) { WriteFile(list, CreateLogPath()); }
Thread.Sleep(1); } } catch { } })); thread.IsBackground = true;
thread.Start(); } #endregion #region 写文件 /// <summary> ///
写文件 /// </summary> public static void
WriteFile(List<string> list, string path) { try { if
(!Directory.Exists(Path.GetDirectoryName(path))) {
Directory.CreateDirectory(Path.GetDirectoryName(path)); } if
(!File.Exists(path)) { using (FileStream fs = new FileStream(path,
FileMode.Create)) { fs.Close(); } } using (FileStream fs = new
FileStream(path, FileMode.Append, FileAccess.Write)) { using
(StreamWriter sw = new StreamWriter(fs)) { list.ForEach(item => {
#region 日志内容 string value = string.Format(@”{0} {1}”,
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss.fff”), item); #endregion
sw.WriteLine(value); }); sw.Flush(); } fs.Close(); } } catch { } }
#endregion #region 生成日志文件路径 /// <summary> ///
生成日志文件路径 /// </summary> public static string
CreateLogPath() { int index = 0; string logPath; bool bl = true; do {
index++; logPath = Path.Combine(path, “Log” +
DateTime.Now.ToString(“yyyyMMdd”) + (index == 1 ? “” : “_” +
index.ToString()) + “.txt”); if (File.Exists(logPath)) { FileInfo
fileInfo = new FileInfo(logPath); if (fileInfo.Length < fileSize) {
bl = false; } } else { bl = false; } } while (bl); return logPath; }
#endregion #region 写错误日志 /// <summary> /// 写错误日志 ///
</summary> public static void LogError(string log) {
msgQueue.Enqueue(new Tuple<string, string>(“[Error] “, log)); }
#endregion #region 写操作日志 /// <summary> /// 写操作日志 ///
</summary> public static void Log(string log) {
msgQueue.Enqueue(new Tuple<string, string>(“[Info] “, log)); }
#endregion } } View Code

测试代码:

图片 2using
System; using System.Collections.Generic; using System.ComponentModel;
using System.Data; using System.Drawing; using System.Linq; using
System.Text; using System.Threading; using System.Threading.Tasks; using
System.Windows.Forms; using Utils; namespace WindowsFormsApplication1 {
public partial class Form1 : Form { public Form1() {
InitializeComponent(); } private void Form1_Load(object sender,
EventArgs e) { LogUtil.path = Application.StartupPath + “\log”;
//初始化日志路径 } private void button1_Click(object sender, EventArgs
e) { for (int n = 0; n < 10; n++) { Thread thread = new Thread(new
ThreadStart(() => { int i = 0; for (int k = 0; k < 50000; k++) {
LogUtil.Log((i++).ToString() + ”
abcdab[email protected]#$%^&dabcdabcdabcdabcdabcdabcdabcdabcd”);
} })); thread.IsBackground = true; thread.Start(); } } } } View Code

 测试截图:

图片 3

图片 4

 

100多行代码实现6秒完成50万条多线程并发日志文件写入,支持日志文…

代码:

后端代码:

public IActionResult DownloadFile()
{
var FilePath = @”./files/deparment.xlsx”;
var stream = System.IO.File.OpenRead(FilePath);
return File(stream, “application/vnd.android.package-archive”,
Path.GetFileName(FilePath));
}

页面代码:

<a href=”;

上传文件:

nuget下载:EPPlus.Core

基本思路:目前是通过将页面上传入的文件保存至项目地址里面,再读取出来,再判断传入ecxel文件的头部是否符合要求,符合则写入数据库

发表评论

电子邮件地址不会被公开。 必填项已用*标注