C#寻找一种线程安全且有效的方法来捕获跨多个名称空间的运行时间
我们开始在代码中捕获执行特定任务的时间度量。使用Stopwatch类可以完成任务,但需要考虑的是Stopwatch在单个函数或代码块中测量时间是有效的,但在应用程序的不同点(多个名称空间)之间测量时间的效果不是很好。最终将合并一个实际的遥测服务,如Application Insights,但目前我们只需要时间,并将其写入日志 我的秒表获取者/设定者的参考类C#寻找一种线程安全且有效的方法来捕获跨多个名称空间的运行时间,c#,multithreading,performance,stopwatch,C#,Multithreading,Performance,Stopwatch,我们开始在代码中捕获执行特定任务的时间度量。使用Stopwatch类可以完成任务,但需要考虑的是Stopwatch在单个函数或代码块中测量时间是有效的,但在应用程序的不同点(多个名称空间)之间测量时间的效果不是很好。最终将合并一个实际的遥测服务,如Application Insights,但目前我们只需要时间,并将其写入日志 我的秒表获取者/设定者的参考类 namespace MyApp.Application.Contracts.Core.References public class Sto
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; }
}
我们正在计时的代码通过许多不同名称空间中的多个方法运行。在我们称之为方法B的过程中,它就完成了。停止这个计时器实例的正确方法是什么?请记住,系统将有许多用户可能同时进行相同的调用,因此线程安全是我们最关心的问题
我愿意听取关于替代方法的建议。提前谢谢 假设您所说的任务是在代码中定义良好的位置开始的,那么在那里测量时间就足够了,例如:
public void StartTask(Action task)
{
var sw = new Stopwatch();
task();
sw.Stop();
...
}
给定任务使用哪些方法和名称空间并不重要
更新
如果要跨多个线程测量时间,可以使用诸如NLog之类的日志库来写入所选方法的日志开始/结束。NLog还将记录线程id。此外,为了能够关联条目,您必须记录会话id或用户id之类的内容
如果不想对代码进行太多修改,可以使用面向方面的编程将日志记录注入到应用程序中
最后,您可以使用常规的导出或一些数据分析工具手动分析日志。我首先想到的是Kibana。但问题的全部前提是,事实并非如此;他从一个地方开始,在另一个地方结束,从另一个线程开始。在不知道您实际在做什么的情况下,我们无法真正评论如何安全地执行此操作。您可以在所有代码中插入对StopWatch引用的引用。
public void StartTask(Action task)
{
var sw = new Stopwatch();
task();
sw.Stop();
...
}