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

using 自动释放资源示例的更多相关文章

  1. c#:使用using关键字自动释放资源未必一定就会有明显好处

    public string ToXML() { string strXml = string.Empty; try { MemoryStream ms = new MemoryStream(); Xm ...

  2. Qt 编程指南 3_1 按钮弹窗手动和自动关联示例

    触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...

  3. requests、BeautifulSoup、自动登陆示例

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  4. java7(3)——增强的catch之自动释放资源

    跟mutilcatch一样,java7提供了自动释放资源的方法,但还是很少看到人使用,估计是麻烦去重写close方法.不过jdk内部一些类已经改成使用增强的catch来释放资源的写法,所以我们有必要了 ...

  5. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  6. spring 组件自动装载示例(@ComponentScan,@Component,@Scope)

    今天学习spring的bean组件装载功能,个人不太喜欢xml文件一个个配置bean的方式,所以主要学习测试注解式的自动装载方式.下面将简单说明下@Component的用法,简单入门示例献给大家.   ...

  7. Autofac手动注入及自动注入示例

    参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...

  8. 新建swap分区的规划、挂载和自动挂载示例

    注:来自Linux系统管理_磁盘分区和格式化的扩展 Linux系统管理_磁盘分区和格式化:http://murongqingqqq.blog.51cto.com/2902694/1361918 思路: ...

  9. JS 实现Table相同行的单元格自动合并示例代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

随机推荐

  1. python之字符编码(二)

    一.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以 ...

  2. python base64加解密

    加密字符串 encodestr = base64.b64encode("chenglee1234".encode(encoding='utf-8')) 解密字符串 decodest ...

  3. 2018-2019-1 20189206 《Linux内核原理与分析》第五周作业

    linux内核分析学习笔记 --第四章 系统调用的三层机制 学习重点--系统调用 用户态.内核态和中断 Intel x86 CPU有四种不同的执行级别,分别是0,1,2,3其中数字越小,特权越高. L ...

  4. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...

  5. delete指针

    是释放指针所指向的内存,而不是删除指针本身

  6. QML常用控件

    这里的控件是显示的元素 1.Item:一切的基类 Item { Image { source: "tile.png" } Image { x: width: height: sou ...

  7. OAuth2.0原理与实现

    弄懂了原理流程,才可以搭建出来.更重要的是,可以根据原理流程自定义搭建,甚至可以完全自己实现一套,最后运行效果和原理和这个对得上就成功了,不要总期待标准答案! 首先参考两篇博客: 阮一峰的博客以及张开 ...

  8. How to check if one path is a child of another path?

    How to check if one path is a child of another path? Unfortunately it's not as simple as StartsWith. ...

  9. Android Studio 快捷键、Debug的使用

    https://blog.csdn.net/q908555281/article/details/49331371 1.快捷键      个人习惯常用快捷键      在Eclipse中常用的快捷键 ...

  10. 一、python (int & str 的方法)

    1.变量:命名与使用 #!/usr/bin/env/ python # -*- coding:utf-8 -*- name = 'liQM' 只能包含字母.数字或下划线: 第一个字符不能是数字: 简短 ...