我正在尝试找到测量在Application Insights上记录它们的方法的持续时间的最佳方法,我知道如果我们做这样的事情是可能的:
public void TestMethod()
{
var sw = Stopwatch.StartNew();
//code here
sw.Stop();
Console.WriteLine("Time elapsed: {0}", sw.Elapsed);
}
但是,正如您所想,我不想在所有方法上编写它,理想情况下,我想使用装饰器,类似于此。
[MeasureTime]
public void TestMethod()
{
//code here
}
或类似的东西。所以我的问题是:我怎样才能建立这样的东西?有没有更好的方法呢?
提前致谢!
答案 0 :(得分:9)
这样做的一种方法是使用像'Fody'这样的装配编织器,其扩展名可以完全满足您的要求。有关示例扩展名,请参阅此链接:https://github.com/Fody/MethodTimer
Fody的工作原理是它在编译时将代码注入代码库,利用你在答案中建议的属性。提供的扩展名正如您所描述的那样,使用秒表记录代码的执行时间。
编辑:使用示例:
安装库后,您可以将注释[Time]添加到您要测量的方法中:
[Time]
public void TestMethod()
{
//code here
}
然后,您可以创建自定义拦截器(将由Fody扩展自动选取的静态类),您可以使用该拦截器将度量标准跟踪添加到应用程序洞察中:
public static class MethodTimeLogger
{
public static void Log(MethodBase methodBase, long milliseconds)
{
var sample = new MetricTelemetry();
sample.Name = methodBase.Name;
sample.Value = milliseconds;
// Your telemetryClient here
telemetryClient.TrackMetric(sample);
}
}
答案 1 :(得分:-1)
我所做的是创建一个IDisposable
类,它将在构造函数中启动秒表并在dispose中停止/打印结果:
public class Superwatch : IDisposable
{
static Stopwatch Watch = new Stopwatch();
static Superwatch()
{
Watch.Start();
}
TimeSpan Start;
public Superwatch()
{
Start = Watch.Elapsed;
}
public void Dispose()
{
TimeSpan elapsed = Watch.Elapsed - Start;
Console.WriteLine($"Time elapsed: {elapsed}");
}
}
然后将方法打包成使用您创建的类的实例。
using (var watch = new Superwatch())
{
//piece of code
}
不像装饰者那样干净,但是相对干净的imo并且可以为代码片段配置。