using 自动释放资源示例
我们在使用SqlConnection的时候可以加入using,那么在using语句结束后就会自动关闭连接。那么这种情况是怎么是实现的呢?我们能够自己写一个类似于SqlConnection的类来让using自动关闭呢?
回答当然是没问题的了。首先我们自己写这个类必须要实现IDisposable接口,示例代码如下:
public class LogWriter : IDisposable { public LogWriter() { Console.WriteLine("初始化成功..."); } public void Dispose() { Console.WriteLine("释放资源..."); } }
使用代码如下:
static void Main(string[] args) { using (LogWriter log = new LogWriter()) { Console.WriteLine("执行中代码.."); } Console.ReadKey(); }
执行的结果如下:
基于以上内容,我们可以通过这种方式来记录耗时,首先定义一个类,如下:
public class WriteLog : IDisposable { private Stopwatch totalWatch = new Stopwatch(); //总耗时 private Stopwatch stepWatch = new Stopwatch(); //单步耗时 /// <summary> /// 构造函数,传入当前日志记录对象的说明信息 /// </summary> /// <param name="remark"></param> public WriteLog(String remark) { Msg = new StringBuilder(remark); totalWatch.Start(); stepWatch.Start(); } /// <summary> /// 单步消耗时间 /// </summary> public int StepTime { get; set; } /// <summary> /// 记录日志的消息 /// </summary> public StringBuilder Msg { get; set; } /// <summary> /// 记录最终日志 /// </summary> private void Write() { totalWatch.Stop(); stepWatch.Stop(); Msg.AppendFormat("总耗时:{0}毫秒\r\n", totalWatch.ElapsedMilliseconds); Helper.logWriter.Info(Msg); } /// <summary> /// 累加日志信息,记录操作步骤名称和脚本,并自动记录耗时 /// </summary> /// <param name="msg">步骤说明</param> /// <param name="sql">sql脚本</param> public void Append(String msg, String sql) { stepWatch.Stop(); Msg.AppendFormat("执行{0}耗时:{1}毫秒。", msg, stepWatch.ElapsedMilliseconds); if (!string.IsNullOrEmpty(sql)) { Msg.AppendFormat("\tsql:{0}", sql); } Msg.AppendLine(); //大于1分钟,记录错误日志 if (stepWatch.ElapsedMilliseconds > 60 * 1000) { Helper.logWriter.Error(string.Format("执行{0}耗时:{1}毫秒。sql:{2}", msg, stepWatch.ElapsedMilliseconds, sql)); } stepWatch.Restart(); } /// <summary> /// 释放资源,直接写入日志 /// </summary> public void Dispose() { Write(); } }
调用方法如下:
using (WriteLog log = new WriteLog("任务:" + this.task.Id + "\r\n")) { //逻辑处理 log.Append("从Oracle查询出DataTable", sql); InsertData(dt); log.Append("从DataTable写入结果表wifi.analysis_collision_result", ""); }//using结束,自动写入日志
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗