3

我的 WCF 服务是用 .NET 4.0 编写的,存在第二个或任何其他调用卡住的问题。WCF 服务除了调用一个用 Delphi XE 编写的 COM 对象之外什么也不做。线程模型设置为 Both,服务的 InstanceContextMode 设置为 PerCall。该对象并没有比 BSTR DoRequest(BSTR Request) 多多少。我使用 Marshal.ReleaseComObject,但在一篇文章中读到这不是清理 com 对象的好方法;我也试过没有。

我尝试了以下事情:

  • 添加了日志记录以查看 WCF 服务卡在的位置。它在 COM 调用中。
  • 添加了一个未处理的异常处理程序,但没有异常。
  • 检查 Delphi 对象是否使用静态变量
  • 尝试使用 Delphi XE2 进行编译(可能是 delphi com 库中的错误)
  • 使用多线程 Delphi 压力测试工具尝试了 Object 以查看问题是否相同,但效果很好。
  • 使用 C# 控制台压力测试工具尝试了该对象,并获得了与 WCF 服务中相同的行为。
  • 在创建对象、调用和销毁对象周围添加了一个锁定对象。这没有帮助。
  • 尝试在 WCF 中创建一个新线程并将线程模型设置为 STA;将 Delphi 对象线程模型设置为 Single。这没有帮助。
  • 试图在 COM+ 服务中运行对象;这没有帮助。
  • 检查 WCF 限制,设置为 100
  • 检查服务的最大连接数并设置为 MaxInt

COM DLL 是 32 位的,所以我的 VStudio 项目设置限制为 x86。我在 Windows 2008 R2 上运行。也许这确实很重要:Delphi COM 对象加载了一个 C++ DLL,这可能不是安全的。

我使用 Reflector + Dennis Bauer FileDisassembler 来反编译生成的 COM Wrapper。我看不出有什么特别之处。

使用 Windebug 似乎并不容易,因为 Delphi 不支持 PDB 文件。

没有想法,请帮助:-)

4

1 回答 1

2

我在 delphi 代码中围绕所有对第三方 dll 的调用添加了一个关键部分。看起来它现在正在工作。这并不能解释 com 对象的行为,但现在它似乎起作用了。

于 2012-06-01T14:04:11.627 回答