草庐IT

c# - 关联 IComMethodEvents

coder 2023-11-14 原文

实现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/

有关c# - 关联 IComMethodEvents的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  5. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  8. ruby-on-rails - 如何在 Rails 4 中搜索关联 - 2

    我想获取主题名称与搜索关键字匹配的所有配置文件。现在我正在加载所有配置文件。我需要知道如何实现它。非常感谢任何帮助。配置文件.rbhas_many:categorizationshas_many:subjects,through::categorizations主题.rbhas_many:categorizationshas_many:profiles,through::categorizations分类.rbbelongs_to:profilebelongs_to:subjectviews/search/index.html.erb#searchform'get'do%>nil%>#

  9. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  10. ruby-on-rails - rails 多态关联(遗留数据库) - 2

    我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint

随机推荐