【发布时间】:2011-01-03 11:00:37
【问题描述】:
在启用跟踪编译的应用程序中,跟踪语句将始终执行,即使侦听器配置为丢弃它们。有时,格式化跟踪消息需要做大量工作,例如:
Trace.Write(IAmExpensiveToRender.ToString() + " requested the following " + string.Join(",", itemList)));
最好将格式化推迟到跟踪消息被过滤之后,实现这一点的一种方法是将Func<string>而不是string传递给跟踪方法:
Trace.Write((Func<string>)(() => IAmExpensiveToRender.ToString() + " requested the following " + string.Join(",", itemList)));
System.Diagnostics.Trace 类支持此功能(因为它具有接受对象的包罗万象的重载),但需要自定义侦听器通过调用 Func 来获取实际字符串。
我无法想象还没有人尝试过这个。是否有任何现有的跟踪库和/或侦听器可以利用这一点? (我一个都找不到)
[更新]经过一番反思,似乎接受格式化字符串 + 参数列表的 Trace 重载已经支持延迟格式化。他们将字符串 + args 传递给 TraceListener,然后仅当消息实际写入文件时才进行格式化。
【问题讨论】: