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结束,自动写入日志
  • 相关阅读:
    Bzoj3998 [TJOI2015]弦论
    Bzoj3669 [Noi2014]魔法森林
    Bzoj2157 旅游
    Bzoj3282 Tree
    POJ1743 Musical Theme
    CodeVs1515 跳
    Bzoj1013 [JSOI2008]球形空间产生器sphere
    Bzoj1007 [HNOI2008]水平可见直线
    洛谷P3120 [USACO15FEB]Cow Hopscotch
    洛谷P3112 [USACO14DEC]后卫马克Guard Mark
  • 原文地址:https://www.cnblogs.com/duanjt/p/8655759.html
Copyright © 2011-2022 走看看