封装方法调用

时间:2012-02-17 13:03:27

标签: c# .net

我有一些机制来衡量方法执行时间。只需在方法开始时节省时间,最后我节省时间,并比较这两个值。

但每次我想使用它我需要改变方法体。

我正在寻求一种更清洁的方式 - 比如有一个对象负责测量时间,可以封装方法调用 - 比如一些包装器,调用该方法,传递返回值,并在该过程中也测量时间。

另外,我知道它可能是一个小小的科幻小说,但有没有办法包装或附加到所有方法(甚至方法的子集)?它也可以用于例如日志记录 - 比如“我正在调用实例XXX的方法,其中包含参数YYY并返回值为vas ZZZ”?

我知道在Java EE中可以做到这样的事情。 (我认为它被称为拦截器,如果我没记错,他们可以附加到一些或所有方法并添加功能,但我不知道这是否可能在.net)

谢谢。

4 个答案:

答案 0 :(得分:5)

我使用了这个简单的方法:

TimeSpan TimeAction(Action action)
{
    var sw = new Stopwatch();
    sw.Start();
    action.Invoke();
    sw.Stop();
    return sw.Elapsed;
}

这是如何使用它

var time = TimeAction(() =>
{
    //your code here    
});

答案 1 :(得分:3)

我正在使用带有IDIsposable接口的Stopwatch Wrapper来测量方法/代码块的执行时间。

  public class AutoStopwatch : IDisposable
  {
    private Stopwatch autoStopwatch;
    private String method;
    public AutoStopwatch(String Method)
    {
      this.method = Method;
      autoStopwatch = Stopwatch.StartNew();
    }
    public void Dispose()
    {
      autoStopwatch.Stop();
      Debug.Print(string.Format("Elapsed for {0} : {1}", method, autoStopwatch.Elapsed.ToString()));
    }
  }
}

//示例

 using (AutoStopwatch Awatch = new AutoStopwatch("Read Keys from REDIS"))
            {
              //  Your Stuff
            }:

答案 2 :(得分:0)

这里很棒的方法是使用面向方面的编程,比如PostSharp ...这里是用于时间测量的示例:http://theburningmonk.com/2010/03/aop-method-execution-time-watcher-with-postsharp/

优点是,您只需在方法中添加属性,而不必更改/“污染”方法体。

干杯, 基督教

答案 3 :(得分:0)

PostSharp Aspects可以帮助您,查看其功能页面上的示例:

http://www.sharpcrafters.com/postsharp/features