如何在发布模式下使用 C# #if debug(预处理程序指令)而不更改生产环境中的文件?

问题描述 投票:0回答:1

我想了解我是否可以在我的开发场景中使用#if。我想捕获生产环境中每个方法的执行时间。

为此,我正在考虑使用秒表类,并根据配置文件中设置的条件将经过的时间写入日志。在配置文件中,我们有一个名为 Loglevel 的选项,它包含诸如“Error、debug、info、All”之类的值。在生产中,我们将日志级别类型设置为“错误”以仅捕获错误。所以我要写的日志不会写在文件里。当客户报告问题时,我们会将错误日志设置更改为调试,以便所有信息都写入日志中。

但是,我不想采用这种方法,因为即使我将 LogLevel 值设置为仅捕获错误,也会执行不必要的行代码。所以计划使用 #if 调试来捕获执行时间。我不确定这是否适用于生产环境而不替换以发布模式构建的 dll 或项目文件。 #if debug 会在发布模式下工作吗?如果是这样,我如何在不替换文件且仅更改配置的情况下执行代码行以捕获执行时间? TIA.

下面是示例代码

public int process()
{
#if Debug
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
#endif
    Int a = 20;
    Int b = 30;
    Int c = a+ b;
#if Debug
    stopwatch.Stop();
    this.WritePerformanceLog(0, System.Reflection.MethodInfo.GetCurrentMethod().ReflectedType.ToString()+" "+System.Reflection.MethodInfo.GetCurrentMethod().Name, "API", DateTime.UtcNow, DateTime.UtcNow,stopwatch.Elapsed.ToString());
    stopwatch = null;
#endif
    return C
}
c# .net asp.net-mvc-4 preprocessor-directive
1个回答
0
投票

我想捕获生产环境中每个方法的执行时间。

使用分析器。

虽然秒表的开销相当低。为 each 方法调用 写入日志只会破坏您的性能。在你的代码中加入#if-directives 以启用秒表将使你的代码变得一团糟,无法阅读,甚至可能无法很好地衡量性能。

探查器正是为此目的而设计的,应该可以在根本不更改程序集的情况下工作,并且应该具有相当低的开销,具体取决于您使用的模式。 Visual Studio 内置了一个分析器,但也有第三方的。

秒表可能有助于检查已知速度较慢的特定方法的运行时间,以及无论如何您可能需要记录的地方,因此添加秒表基本上是免费的,在类似数据库的情况下可能是有用的诊断工具打电话或类似的时间比预期的要长得多。

© www.soinside.com 2019 - 2024. All rights reserved.