支持多线程写入txt,日志文件
第一种文件共享方式会丢失数据,FileShare.Write:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | static void WriteLog() { try { var logFilePath = "log.txt" ; var now = DateTime.Now; var logContent = string .Format( "Tid: {0}{1} {2}.{3}\r\n" , Thread.CurrentThread.ManagedThreadId.ToString().PadRight(4), now.ToLongDateString(), now.ToLongTimeString(), now.Millisecond.ToString()); var logContentBytes = Encoding.Default.GetBytes(logContent); //由于设置了文件共享模式为允许随后写入,所以即使多个线程同时写入文件,也会等待之前的线程写入结束之后再执行,而不会出现错误 using (FileStream logFile = new FileStream(logFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) { logFile.Seek(0, SeekOrigin.End); logFile.Write(logContentBytes, 0, logContentBytes.Length); } } catch (Exception ex) { Console.WriteLine(ex.Message); } |
第二种 ReaderWriterLockSlim:
public static void WriteFile(string i) { var sqlPath= System.IO.Directory.GetCurrentDirectory()+ "\\log\\sql"; if (!Directory.Exists(sqlPath)) { DirectoryInfo di = Directory.CreateDirectory(sqlPath); } var logFilePath = sqlPath + "\\"+DateTime.Now.ToString("yyyy-MM-dd")+".txt"; lockSlim.EnterWriteLock();//打开写操作锁 try { string TestText = i.ToString(); File.AppendAllText(logFilePath, i+ "\r\n"); } finally { lockSlim.ExitWriteLock();//占用完后退出 } }
推荐第二种
完整版:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace StdioMQTT { public class LogHelper { static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim(); public static void SqlWriteFile(string i) { var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\sql"; if (!Directory.Exists(sqlPath)) { DirectoryInfo di = Directory.CreateDirectory(sqlPath); } var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; lockSlim.EnterWriteLock();//打开写操作锁 try { string TestText = i+ DateTime.Now.ToString(); File.AppendAllText(logFilePath, i + "\r\n"); } finally { lockSlim.ExitWriteLock();//占用完后退出 } } public static void InfoWriteFile(string i) { var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\info"; if (!Directory.Exists(sqlPath)) { DirectoryInfo di = Directory.CreateDirectory(sqlPath); } var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; lockSlim.EnterWriteLock();//打开写操作锁 try { string TestText = i+DateTime.Now.ToString(); File.AppendAllText(logFilePath, i + "\r\n"); } finally { lockSlim.ExitWriteLock();//占用完后退出 } } public static void ErroWriteFile(string i) { var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\erro"; if (!Directory.Exists(sqlPath)) { DirectoryInfo di = Directory.CreateDirectory(sqlPath); } var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; lockSlim.EnterWriteLock();//打开写操作锁 try { string TestText = i + DateTime.Now.ToString(); File.AppendAllText(logFilePath, i + "\r\n"); } finally { lockSlim.ExitWriteLock();//占用完后退出 } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
2011-05-23 使用web服务