我们开始捕获时间测量值以在我们的代码中执行特定任务。使用 Stopwatch 类可以完成工作,但问题是 Stopwatch 可以有效地测量单个函数或代码块内的时间,但在应用程序的不同点(多个命名空间)之间则效果不佳。最终将合并一个实际的遥测服务,例如 Application Insights,但现在我们只需要时间并将它们写入日志。
我的秒表 getter/setter 引用类
namespace MyApp.Application.Contracts.Core.References
public class StopwatchReference
{
/// <summary>
/// The Timer is used to accurately measure the elapsed milliseconds of specific tasks
/// </summary>
public Stopwatch Timer { get; set; }
}
我用方法A启动 watch
var startTime = new StopwatchReference();
startTime.Timer.Start();
我们正在计时的代码通过许多不同命名空间中的多个方法运行。它在我们称为方法 B 的过程中完成。停止计时器的这个确切实例的正确方法是什么?请记住,系统可能会有许多用户同时进行相同的调用,因此线程安全是我们的首要关注点。
我愿意接受有关替代方法的建议。提前致谢!
最佳答案
假设您正在谈论的任务是在代码中定义明确的位置开始的,那么测量那里的时间就足够了,例如:。
public void StartTask(Action task)
{
var sw = new Stopwatch();
task();
sw.Stop();
...
}
给定任务使用哪些方法和命名空间并不重要。
更新
如果你想跨多个线程测量时间,你可以使用像 NLog 这样的日志库来写入所选方法的日志开始/结束。 NLog 还将记录线程 ID。此外,您还必须记录诸如 session ID 或用户 ID 之类的内容才能关联条目。
如果您不想过多地修改您的代码,您可以使用面向方面的编程将日志记录注入(inject)您的应用程序。
最后,您可以使用正则表达式或一些数据分析工具手动分析您的日志。我第一个想到的是 Kibana。
关于C# 寻找一种线程安全且有效的方法来捕获跨多个命名空间的耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40744826/