首页 > 技术文章 > using 自动释放资源示例

duanjt 2018-03-27 09:53 原文

我们在使用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结束,自动写入日志

 

推荐阅读