【发布时间】:2017-09-04 13:52:43
【问题描述】:
我想开始测量一个函数在我的程序中的多个位置运行所花费的时间。
处理StopWatch 在代码中似乎有点乱,所以我决定把它包装起来。
这些是我需要的东西:
- 该函数将接收一个可能有也可能没有返回值的异步函数
- 我需要退出函数两件事:返回值(如果存在)和运行时间(以秒为单位)
我想找到一个可读且可持续的解决方案,因为它将用于多个项目。
这是我到目前为止所做的:
public class TimeMeasurer
{
private readonly Stopwatch _stopWatch;
public TimeMeasurer()
{
_stopWatch = new Stopwatch();
}
public async Task<Tuple<double, TReturn>> Start<TReturn>(Func<Task<TReturn>> function)
{
try
{
_stopWatch.Start();
var val = await function();
var took = _stopWatch.Elapsed.TotalSeconds;
return Tuple.Create(took, val);
}
finally
{
_stopWatch.Stop();
_stopWatch.Reset();
}
}
public async Task<double> Start(Func<Task> function)
{
try
{
_stopWatch.Start();
await function();
var took = _stopWatch.Elapsed.TotalSeconds;
return took;
}
finally
{
_stopWatch.Stop();
_stopWatch.Reset();
}
}
}
如果没有更好的解决方案..
- 有没有办法在两个函数之间进行合并? (一个包含返回值,第二个包含 void 函数)
- 有没有办法返回比元组更清晰的东西?我觉得处理起来有点乱
编辑:调用我创建的类也不好看..
var tuple = await _timeMeasurer.Start(async () => await function(param1, param2));
编辑:我决定放弃这个想法。它太乱了。最后我使用秒表
【问题讨论】:
标签: c# asp.net .net async-await stopwatch