专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

6秒完成50万条多线程并发日志文件写入

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:43:27       共计:3610 浏览
100多行代码实现6秒完成50万条多线程并发日志文件写入,支持日志文件分隔

日志工具类代码:

using 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       } }

测试代码:

using 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() + "    abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcda3.1415bcdabcdabcdabcdabc@#$%^&dabcdabcdabcdabcdabcdabcdabcdabcd");                     }                 }));                 thread.IsBackground = true;                 thread.Start();             }         }     } }


版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C#并行编程-PLINQ:声明式数据并行 | ·下一条:详解C# Tuple VS ValueTuple(元组类 VS 值元组)

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有