在实现IComMethodEvents时,你将得到三个事件:
- OnMethodCall
- OnMethodException
- OnMethodReturn
我的目标是记录COM+组件中每个方法的调用时间。
可以通过在COMSVCSEVENTINFO结构中使用 lTime
和 lMicroTime
获取事件的时间,因此通过在OnMethodCall
和OnMethodReturn
中记录时间,我应该能够计算出调用时间,但如何确保这两个事件相关呢?
通过测试,看起来我应该能够使用即时(JIT)激活的对象oid
。
这样做可能会有问题吗?还是有其他方法?
可能存在的一个问题是,我发现oid
经常被重用,因此如果由于某种原因事件的顺序发生了变化,那么实现关联可能会更加困难。
更新1:
进一步测试表明,在多用户场景下仅使用oid
是不够的。同一对象在同一时间被使用,因此至少需要使用oid
和原始调用者
来进行关联。后续问题是:如何从COM+事件订阅程序获取原始调用者?
更新2:
刚发现了 IComMethod2Events。不同之处在于事件具有执行调用的线程标识符。测试看起来很有前途,我想象不出任何相关性错误的情况。COM+组件的线程模型为 Any Apartment
。
更新3
在这篇文章Creating COM+ PerfMon Counters to Monitor COM+ Data中使用了 oid
。我认为在多线程公寓中这是不够的。
注:最终我将在Delphi中实现这个,所以我添加了Delphi标签。我也添加了C#标签,因为实现接口所使用的语言可能根本不重要。 更新:暂时添加c++标签,只是为了吸引那些真正使用过这些东西的人的注意。
AppMetrics
。也许很有用,你可以弄清楚他们如何进行监视。 - LU RDMSDN COM+ Tracking
。 - LU RD