【问题标题】:C# - StackTrace | calls method when "FrameCount" changedC# - 堆栈跟踪 |当“FrameCount”改变时调用方法
【发布时间】:2018-11-08 11:22:01
【问题描述】:

我需要知道函数何时被调用以及函数何时结束。 否则,我需要在每次更改“StackTrace.FrameCount”时进行检测。

我的想法是将我的函数插入“StackTrace.FrameCount”的 Setter 并重定向到 FrameCount 的基本函数,但是...... 问题是,“StackTrace.FrameCount”只有一个 GETTER。

    //
    // Zusammenfassung:
    //     Gets the number of frames in the stack trace.
    //
    // Rückgabewerte:
    //     The number of frames in the stack trace.
    public virtual int FrameCount { get; }

是否有可能制作一个 PropertyChangedEventHandler 或其他东西来管理这个问题?

非常感谢! :)

托马斯

【问题讨论】:

  • 您能告诉我们您为什么要这样做的背景吗? 如果有替代解决方案。您使用的是哪个版本的 .NET Core?
  • 我需要做一个“Performance-Watch”,每个功能花费了多少时间。现在非常困难,因为我需要在函数的开头和结尾插入一个方法调用。我使用 .Net-Core 2.1。
  • 没有办法像您希望的那样简单,因为代码运行时不会维护包含当前堆栈跟踪的任何内容,而是按需生成堆栈跟踪。请说明您正在尝试解决哪个问题,这是一个解决方案,必须有一种不同且更好的方法来完成您想要的。
  • 通常,性能分析器会以每秒 N 次的速度对每个线程当前所处的位置进行快照,并从中构造调用堆栈,或者通过向每个方法入口和出口添加代码来检测代码。我不知道如何做前者,后者可以通过 mono.cecil 或 ildasm/ilasm 或类似的方法来完成。无论哪种方式,这将是一个很好的工作部分。您确定没有现有的工具可供您使用,例如 dotTrace 吗?
  • 我假设您正在寻找一些 AOP 方法来拦截方法调用,请查看 MethodBoundaryAspect.Fody (github.com/vescon/MethodBoundaryAspect.Fody),我们使用它通过使用自定义属性装饰方法来实现性能检查。

标签: c# windows visual-studio .net-core


【解决方案1】:

您可能正在寻找某种 AOP 来拦截方法进入和退出“事件”。一个简单的方法是例如MethodBoundaryAspect.Fody,它使您能够编写一个自定义属性来公开三种不同的拦截方法,OnEntryOnExitOnException。要测量方法的性能,您可以简单地在OnEntry 中启动秒表并在OnExit 中停止并显示经过的时间。

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2012-01-10
    • 2016-09-03
    • 2016-02-19
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多