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

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

编辑:我当前正在添加key的sessionId。 无法解决没有会话ID的问题

#1楼 票数:1 已采纳

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

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

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

  ask by Al. translate from so

未解决问题?本站智能推荐:

1回复

在多线程系统中使用静态对象

我想知道多线程系统以下列方式使用静态类意味着什么: 不使用服务: A 类的多个实例使用相同的静态 B 类进行一些随机计算(例如 System.Math) 使用 WCF 服务: 一种。 让 1 个 WCF 服务执行 1 中描述的操作。 湾拥有多个 WCF 服务,每个服务都有 1 个 A 类
2回复

在WCF中管理静态数据

我正在一个解决方案中工作,该解决方案在项目之间共享的库中具有静态日志记录对象。 它的结构如下: 它适用于各种Windows应用程序和Windows服务:它们可以在启动时初始化AppLog.AppName,并可以在整个代码中调用AppLog.Write 。 共享模块将写入根据AppNa
2回复

如何处理WCF服务中的静态方法?

我是WCF的初学者。 我正在尝试使设备驱动程序网络可访问。 我现在拥有的代码,已简化: A.cs Driver.cs DllImport.cs 这个驱动程序对我来说很好用。 在控制设备的示例中,我仅添加对此驱动程序的引用,并使用驱动程序的方法控制设备。
1回复

如何在WCF服务中使用服务定位器

我正在使用服务定位器来保存类的具体实例,这些实例在WCF服务中使用。 而不是传递ServiceLocator,我决定让它静态,所以我可以从每个类访问它。 当WCF服务启动时,将填充服务定位器,并且根据某些参数,它可以填充不同的具体实现。 我的问题是,如果在另一个调用完成之前调用WCF服
2回复

如何在WCF中跨进程共享静态对象?

背景: 我问了有关为WCF服务创建缓存的提供程序结构的问题 。 我现在已经实现了该设计,但是在测试中我注意到,实际上并未缓存提供程序。 我怎么知道 我在服务中添加了以下调试级别的日志记录: 我注意到的是,无论我调用该服务多少次,始终会实例化提供程序(它永远找不到缓存的版本)。
1回复

WCF中的InstanceContextMode.PerCall是否会实例化所有静态变量/方法?

在我的WCF代码中,用户的ID和名称存储在静态变量中。 它是从HttpContext.Current.User.Identity.Name和数据库命中检索的。 另外还有其他静态变量来存储连接字符串,与日志文件相关的内容等。 最近,我发现自己处于竞争状态,当第一个呼叫仍在处理时,来自客户
1回复

如何访问WCF服务上的静态成员?

我想访问位于WCF服务中的静态成员。 我试图从Windows应用商店应用访问此MyEvent成员,但是它不起作用。 我想完成这样的事情(类似于msdn的示例):
1回复

如何在WCF中使用静态对象?

我正在实现一个Log4Net工具包 使用方法: 问题: 我总是需要打电话给: 在ASP.NET应用程序中,我只能在Session_Start事件中调用一次,但是在WCF服务应用程序中该怎么做 任何帮助表示赞赏。