Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#寻找一种线程安全且有效的方法来捕获跨多个名称空间的运行时间_C#_Multithreading_Performance_Stopwatch - Fatal编程技术网

C#寻找一种线程安全且有效的方法来捕获跨多个名称空间的运行时间

C#寻找一种线程安全且有效的方法来捕获跨多个名称空间的运行时间,c#,multithreading,performance,stopwatch,C#,Multithreading,Performance,Stopwatch,我们开始在代码中捕获执行特定任务的时间度量。使用Stopwatch类可以完成任务,但需要考虑的是Stopwatch在单个函数或代码块中测量时间是有效的,但在应用程序的不同点(多个名称空间)之间测量时间的效果不是很好。最终将合并一个实际的遥测服务,如Application Insights,但目前我们只需要时间,并将其写入日志 我的秒表获取者/设定者的参考类 namespace MyApp.Application.Contracts.Core.References public class Sto

我们开始在代码中捕获执行特定任务的时间度量。使用Stopwatch类可以完成任务,但需要考虑的是Stopwatch在单个函数或代码块中测量时间是有效的,但在应用程序的不同点(多个名称空间)之间测量时间的效果不是很好。最终将合并一个实际的遥测服务,如Application Insights,但目前我们只需要时间,并将其写入日志

我的秒表获取者/设定者的参考类

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();
   ...
}