- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
实现IComMethodEvents时你得到三个事件。
我的目标是记录 COM+ 组件中每个方法的调用时间。
可以使用COMSVCSEVENTINFO 中的lTime
和lMicroTime
检索事件的时间。结构,因此通过在 OnMethodCall
和 OnMethodReturn
中记录该时间,我应该能够计算调用时间,但我如何才能确定这两个事件是相关的。
通过测试,我应该能够使用即时 (JIT) 激活对象 oid
。
这样做有什么问题还是有其他方法?
一个可能的问题是我看到 oid
经常被重用,所以如果事件由于某种原因被乱序触发,那么实现关联可能会有点困难。
更新 1:
进一步测试表明,oid
在多用户场景中是不够的。同时使用同一对象,因此必须至少使用 oid
和 original caller
来完成关联。后续问题是:如何从 COM+ 事件订阅者处获取原始调用者?
更新 2:
刚找到IComMethod2Events .区别在于事件具有执行调用的线程的标识符。在测试中看起来很有前途,我无法想象相关性可能会失败的情况。 COM+ 组件的线程模型是Any Apartment
。
更新 3
在这篇文章中Creating COM+ PerfMon Counters to Monitor COM+ Data oid
被使用。我认为这在多线程单元中还不够。
<子>注意:我最终会在 Delphi 中实现它,所以我添加了 Delphi 标签。我还添加了 C# 标记,因为很可能用于实现接口(interface)的语言根本不重要。更新:暂时添加 c++ 标签只是为了引起以前实际使用过这些东西的人的注意。
最佳答案
...if the events for some reason are fired out of order...
他们从不这样做。 COM+ 系统事件发布者使用 COM+ 事件服务触发这些事件。从事件发布者的角度来看,事件的调用是同步的。当发布者触发一个事件时,它不会继续处理下一个事件,直到所有订阅者都完成对触发事件的处理。很自然地,OnMethodReturn/OnMethodException
匹配前不发布事件 OnMethodCall
那些。我记得读过有关 COM+ 事件中竞争条件/中断订阅的知识库文章。据我所知,所有这些错误都已在 Windows 2000 的各种 Service Pack 中得到解决。不过,不可否认,我并不想在这方面保持最新状态。
实现IComMethod2Events
时您订阅了与 IComMethodEvents
相同的临时订阅.所以触发事件的顺序也是一样的。
...so correlation has to be done using at least
oid
andoriginal caller
...
在这一点上,我真的不确定你是否正确地解释了你的测试结果。你究竟如何测试?
oid
应该已经封装了所有需要的信息,即使在具有 JIT 和池化的“多客户端”场景中也是如此。上次实现了这样的事件监听器(已经有一段时间了),依赖oid
结果很好。不过,我环境中的大部分组件都是用 VB6 编写的(因此,存在于 STA 中)。然而,即使使用 STA,您也可以在单个线程的不同执行阶段进行多次调用。由于 COM+ STA 线程池中的线程数存在上限,您可能会遇到以下情况:调用 A 在特定线程上启动,调用 B 在同一线程上启动,调用 B 返回,调用 A 返回。我不记得跟踪 oid
的电话有任何问题。没有“关于调用者的一些额外信息”。
您考虑的实现想法大体上是规范的。 COM+ spy
平台 SDK 附带的示例使用 oid
跟踪单个调用的参数。您可以在 <Path to SDK samples>\Samples\com\administration\spy
中找到该应用程序的源代码.该示例已经使用此实现已有一段时间了(至少从 Windows 2003 开始)。今天是在 MTA 甚至 COM+ 引入之后的一个世纪。如果存在缺陷,样本将在此时更新。希望。
关于c# - 关联 IComMethodEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15402925/
实现IComMethodEvents时你得到三个事件。 OnMethodCall OnMethodException OnMethodReturn 我的目标是记录 COM+ 组件中每个方法的调用时间。
我是一名优秀的程序员,十分优秀!