gpt4 book ai didi

wcf - 在 IIS (7+) 托管的 WCF 服务中使用 STA COM 组件时,如何处理?

转载 作者:行者123 更新时间:2023-12-01 22:00:18 25 4
gpt4 key购买 nike

据我了解,当 COM 组件标记为使用 STA 时使用 MTA线程,调用应该被编码到 STA 线程并从该专用线程执行。对于 Windows 客户端应用程序,这意味着它将在 UI 线程上执行(如果标记为 STA),并且从 COM 组件到我的回调将由发送到隐藏窗口并在Windows 消息循环。

如果我在 IIS 托管的 WCF 服务中使用 STA COM 组件,会发生什么情况?工作进程在 STA 线程上是否会有 Windows 消息循环?我可以用自己的消息循环启动我自己的 STA 线程吗?

最佳答案

COM 运行时负责调度对 STA 内 COM 对象上的方法的调用:您是对的,这基于用于调度 Windows 消息的相同操作系统机制,但您无需担心发生这种情况 - COM 在幕后为您执行此操作。

要做需要担心的是您的 COM 对象将驻留在哪个 STA 中。如果您使用 WCF 服务中的 COM Interop 实例化公寓线程 COM 对象,则需要小心。

如果执行此操作的线程不是 STA 线程,则所有进程内 COM 对象都将位于默认的 Host STA 中。对于 IIS 工作进程。您不希望发生这种情况:所有服务操作的所有 COM 对象最终都将位于同一个 STA 中。线索就在名称中——所有对象只有一个线程——并且对其方法的所有调用都将被序列化,等待公寓中唯一的线程来执行它们。您的服务将无法扩展以处理多个并发客户端。

您需要确保为特定 WCF 请求提供服务而实例化的 COM 对象位于其自己的 STA 中,与为其他请求创建的对象分开。大致有两种方法可以做到这一点:

  • 启动您自己的线程,在启动之前在 SetApartmentState() 中指定 ApartmentState.STA,在该线程上实例化特定请求的 COM 对象。这是 Scott Seely 在 the link in Kev's answer 中详细介绍的方法。 :他确保每个服务操作调用都在新的 STA 初始化线程上调用。沿着这些思路,一个更难但更具可扩展性的解决方案是实现一个可重用的 STA 初始化线程池。
  • 将 COM 对象托管在 COM+ 应用程序中,以便它们位于单独的 DllHost 进程中,其中 COM+(通过其名为 the Activity 的抽象)可以负责将不同请求的对象放入不同的 STA。

当您提到回调时,我不确定您的确切含义。也许您的意思是 COM 方法调用在托管代码中实现的某些 COM 接口(interface),通过作为 COM 对象方法之一的参数传递到 COM 对象的引用:如果是这样,这应该可以工作。但也许你的意思是别的,在这种情况下,也许你可以修改问题以澄清。

关于wcf - 在 IIS (7+) 托管的 WCF 服务中使用 STA COM 组件时,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880516/

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