【问题标题】:How to create a generic method in .NET to capture latency (elapsed times) of different methods with different signatures in my application?如何在 .NET 中创建通用方法以捕获应用程序中具有不同签名的不同方法的延迟(经过时间)?
【发布时间】:2020-09-25 23:10:55
【问题描述】:

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

例如,假设我正在实施延迟度量,我将必须围绕我想要计算延迟的每个方法如下:

    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, U, V, TResult> func, out long latency, T input1, U input2, V input3)
        {
            var sw = Stopwatch.StartNew();
            var result = func(input1, input2, input3);
            sw.Stop();
            
            // set latency out
            latency = sw.ElapsedMilliseconds;
            return result;
        }

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

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

我可以探索其他解决方案吗?

【问题讨论】:

    标签: c# .net delegates


    【解决方案1】:

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

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

    那么你会这样称呼它:

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

    如果您确实需要结果而不仅仅是延迟,您也可以将其收集在一个封闭变量中。

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

    【讨论】:

    • 但是 Action 封装的方法没有返回类型。所以var result = action()上面的行不会编译
    • 谢谢约翰。所以即使现在你没有存储动作结果,第二个例子是如何工作的?
    • 部分操作是设置result。该操作不返回任何内容。它只是写入一个变量,然后调用者可以读取。
    • 如果我的操作是异步的,我需要等待怎么办?用 Task 替换 Action?
    • 你可以用Func&lt;Task&gt;替换它
    猜你喜欢
    • 2018-10-05
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多