gpt4 book ai didi

c# - 关联 IComMethodEvents

转载 作者:可可西里 更新时间:2023-11-01 16:18:13 30 4
gpt4 key购买 nike

实现IComMethodEvents时你得到三个事件。

  1. OnMethodCall
  2. OnMethodException
  3. OnMethodReturn

我的目标是记录 COM+ 组件中每个方法的调用时间。

可以使用COMSVCSEVENTINFO 中的lTimelMicroTime 检索事件的时间。结构,因此通过在 OnMethodCallOnMethodReturn 中记录该时间,我应该能够计算调用时间,但我如何才能确定这两个事件是相关的。

通过测试,我应该能够使用即时 (JIT) 激活对象 oid

这样做有什么问题还是有其他方法?

一个可能的问题是我看到 oid 经常被重用,所以如果事件由于某种原因被乱序触发,那么实现关联可能会有点困难。

更新 1:

进一步测试表明,oid 在多用户场景中是不够的。同时使用同一对象,因此必须至少使用 oidoriginal 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 and original 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com