微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在.NET中创建通用方法来捕获应用程序中具有不同签名的不同方法的延迟经过的时间?

如何解决如何在.NET中创建通用方法来捕获应用程序中具有不同签名的不同方法的延迟经过的时间?

我正在尝试跟踪.NET核心应用程序和引用的库的指标。指标如:延迟,吞吐量,计数,大小,.. etc。

例如,假设我正在实施延迟指标,那么我将必须围绕要计算延迟的每种方法,如下所示:

    var sw = Stopwatch.StartNew();
    var result = MyFunction(input1,input2,input3);
    sw.Stop();
    
    // set latency out
    latency = sw.ElapsedMilliseconds;
    return result;

我正在尝试查看C#中是否有更简洁的方法。我想传递一个委托方法并定义一个这样的函数,以避免重复Stopwatch.StartNew()sw.Stop()

 public static TResult CollectLatency<T,U,V,TResult>(Func<T,TResult> func,out long latency,T input1,U input2,V input3)
        {
            var sw = Stopwatch.StartNew();
            var result = func(input1,input3);
            sw.Stop();
            
            // set latency out
            latency = sw.ElapsedMilliseconds;
            return result;
        }

但是然后我将不得不根据要测量延迟的所有方法来定义此方法的重载,使其具有不同的输入数量

我想到的一个解决方案是只有一个输入,并且要测量的所有方法都只有一个参数(包括所有参数的类引用类型)。但是,这不是一个选择,因为这些方法已有现有的外部使用者,并且在升级过程中会破坏它们。

还有其他可以探索的解决方案吗?

解决方法

您可以将参数传递为closed variables,这样就无需为每种类型的参数实现重载。

public static long CollectLatency(Action action)
{
    var sw = Stopwatch.StartNew();
    action();
    sw.Stop();
    return sw.ElapsedMilliseconds;
}

然后您将其称为tis:

var latency = CollectLatency( () => MyFunction(input1,input2,input3) );

如果您确实需要结果,而不仅仅是等待时间,还可以将其收集在封闭变量中。

SomeType result;
var latency = CollectLatency( () => result = MyFunction(input1,input3) );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。