C# 如何在.NET中创建一个通用方法来捕获应用程序中具有不同签名的不同方法的延迟(运行时间)?

C# 如何在.NET中创建一个通用方法来捕获应用程序中具有不同签名的不同方法的延迟(运行时间)?,c#,.net,delegates,C#,.net,Delegates,我正在尝试跟踪.NET核心应用程序和引用库的指标。诸如:延迟、吞吐量、计数、大小等指标 例如,假设我正在实现延迟度量,我将必须围绕我要计算延迟的每个方法,如下所示: var sw = Stopwatch.StartNew(); var result = MyFunction(input1, input2, input3); sw.Stop(); // set latency out latency = sw.ElapsedMilliseconds

我正在尝试跟踪.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(Func-Func、out-long-latency、T-input1、U-input2、V-input3)
{
var sw=Stopwatch.StartNew();
var结果=func(输入1、输入2、输入3);
sw.Stop();
//设置延迟
延迟=sw.ElapsedMilliseconds;
返回结果;
}
但是接下来我必须定义这个方法的重载,根据我想要测量延迟的所有方法,使用不同数量的输入

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


还有其他解决方案吗?

您可以将参数传递为,这样就不需要为每种类型的参数实现重载

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) );

但是动作封装了没有返回类型的方法。因此,上面的
var result=action()
行将不会编译。因此,即使现在没有存储操作结果,第二个示例是如何工作的?操作的一部分是设置
result
。该操作不会返回任何内容。它只是写入一个调用方可以读取的变量。如果我的操作是异步的,我需要等待怎么办?我是否将操作替换为任务?您将用
Func
SomeType result;
var latency = CollectLatency( () => result = MyFunction(input1, input2, input3) );