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

标签 c# multithreading performance stopwatch

我们开始捕获时间测量值以在我们的代码中执行特定任务。使用 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/

相关文章:

c# - 从 Silverlight 重定向到另一个页面

c# - System.Uri 在 .NET 4.5+ 中删除 Unicode RLM(从右到左标记;U+200F)字符

c# - 找不到命名空间并且无法添加引用

ruby - 如何在 Ruby pg gem 中使用 PG::Connection 类的 send_query?

ruby-on-rails - 对象实例的未定义​​方法 `includes'

c# - Entity Framework 4 中的简单条件 LINQ 查询

multithreading - TestNG如何使用多个线程调用测试方法?

c++ - CPP std::thread 尝试使用已删除的函数

java - 将 List<Object[]> 转换为 HashMap<Integer,List<String>> 什么是最佳方法?

c# - .NET 操作在多核机器上的非线性扩展