zoukankan      html  css  js  c++  java
  • 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}毫秒
    ", 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("	sql:{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 + "
    "))
    {
        //逻辑处理
    
        log.Append("从Oracle查询出DataTable", sql);
    
        InsertData(dt);
    
        log.Append("从DataTable写入结果表wifi.analysis_collision_result", "");
    }//using结束,自动写入日志
  • 相关阅读:
    ubuntu16.04编译安装PHP7.0.9,Nginx1.10,Phalcon3.1扩展
    阿里云云大使推广产品集合
    mysql性能优化-慢查询分析、优化索引和配置
    Js学习笔记(二)
    Javascript学习笔记(一)
    HashMap
    JDK 1.8 新特性
    Java转型
    Java IO
    Java正则表达式
  • 原文地址:https://www.cnblogs.com/duanjt/p/8655759.html
Copyright © 2011-2022 走看看