有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。
可以看到,在我的机子上面,1ms写入了43条日志。
public static BlockingCollection<LogModel> logQueue = new BlockingCollection<LogModel>(3000);public static void QuickLog(string log){LogModel logModel = new LogModel();logModel.Log = log;logModel.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");logQueue.Add(logModel);}//在程序加载的时候,调用一下此方法public static void QuickLogToDatabase(){Task.Run(() =>{string sql;while (true){try{var logModel = logQueue.Take();//以下是写入耗时日志的部分,由自己的具体情况而定//sql = string.Format(Function.SQL.InsertLog, logModel.Log, logModel.Time);//Function.Helper.MySQLHelper.ExecuteNonQuery(sql);}catch (Exception ex){Thread.Sleep(1000);//catch部分,可以写入本地的txt//DebugLog("QuickLogToDatabase:" + ex.Message);}}});}public class LogModel{public string Log { set; get; }public string Time { set; get; }}