0

我正在编写跟踪类来查找模块/方法的执行时间。我有这样的课

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)尝试使用相同的键执行相同的方法,我不会考虑它并跟踪它。那么在这种情况下,最好的选择是什么。任何建议都会有所帮助。

编辑:我目前正在使用密钥附加 sessionId。我不能在没有会话 ID 的情况下解决这个问题

4

1 回答 1

1

如果没有会话 ID,我无法解决此问题

从提供的信息来看,我会说不。如果您有并发请求执行相同的函数调用,那么您将获得重复的条目。避免这种情况的唯一方法是确保所有键都是唯一的。我实际上认为无论如何都需要使用会话 ID,否则如何将函数映射到请求?

此外,Dictionary不是线程安全的(至少对于写入而言),我建议使用ConcurrentDictionary

于 2012-09-17T12:34:51.487 回答