我的 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 文件。
没有想法,请帮助:-)