【发布时间】:2012-09-17 12:10:43
【问题描述】:
我正在编写跟踪类来查找模块/方法的执行时间。我有这样的课
public class Trace
{
static Dictionary<string, Stopwatch> watches = null;
static Trace()
{
Dictionary<string, Stopwatch> watches = new Dictionary<string, Stopwatch>();
}
public static void Start(string key, string losgMessage)
{
try
{
if (!watches.Keys.Contains(key))
{
Stopwatch watch = new Stopwatch();
watch.Start();
watches.Add(key, watch);
}
}
catch
{
}
}
public static void Stop(string key, Object logMessage, string sessionId)
{
try
{
if (!watches.Keys.Contains(key))
{
Stopwatch watch = watches[key];
watch.Stop();
//log goes here
}
}
catch
{
}
}
}
由于 wcf 是多线程环境并且“watches”静态变量范围是应用程序级别,如果有人(来自不同客户端的新 rqst)尝试使用相同的键执行相同的方法,我不会考虑并跟踪它。那么在这种情况下,最好的选择是什么。任何建议都会有所帮助。
edit:我当前正在附加 sessionId 和密钥。如果没有会话 ID,我无法解决此问题
【问题讨论】:
-
从外观上看你也有一个
sessionId,也许将它附加到功能键以使其唯一不是更可靠吗? -
另外,您需要在 Start 和 Stop 方法中使用locks,因为它们正在读/写字典,而其他线程可能同时在处理它。
-
我相信您不打算将它与任何递归方法一起使用。
-
"是的,我目前正在这样做" - 如果是这种情况,那么重复条目应该没有问题 - 假设所有请求都有唯一的会话 ID。跨度>
-
是的,我没有在记录中这样做。方法
标签: c# multithreading wcf static