【问题标题】:SOAP request leaves threads hangingSOAP 请求使线程挂起
【发布时间】:2011-03-19 11:33:16
【问题描述】:


当我发出 SOAP 请求时,我可以看到(在任务管理器中)我的应用程序的线程数从 1(主线程)增加到 8,这意味着 7 个额外的线程,这部分没问题,但是在从服务,线程数减少到 4(3 + 主线程)并保持这种状态,直到发出下一个请求。 由于我对 SOAP 不太满意并且没有过多地使用它,有谁知道这是否正常,或者我是否可以杀死/停止“挂起”的线程?
使用 Delphi 2010

附加信息:我正在线程中运行请求,是的,我在 Execute 方法中调用了“CoInitialize”和“CoUninitialize”。

测试应用:http://www.2shared.com/file/_dE4H-lO/soap_test_app.html

感谢大家的宝贵时间。

【问题讨论】:

  • 您是否在您的应用程序中创建任何线程?我问的原因是,在线程中运行 SOAP 请求非常有用,因此它不会阻塞您的主应用程序。
  • @Chris 抱歉,出于某种奇怪的原因,我忘了提及这一点,是的,我正在线程中运行请求,并且正在动态创建对象并释放它们。
  • 你能提供一点示例代码吗?这样,我们可以尝试重现您的案例并查看哪些胎面保持活动状态。顺便说一句:您可以使用Process Explorer 查看哪些线程处于活动状态。
  • 所以作为一个基线,如果你要制作一个非常基本的肥皂项目,没有额外的线程......只需要一个带有 GO 按钮和一个状态标签的主窗体。当您单击 GO 时,它会发送 SOAP 请求,完成后,它会将标签更新为“done”。当您从 a) 表单打开、b) 单击开始、c) 收到 DONE 时,您对线程数有何观察?这将有助于将问题与一般的 SOAP 问题隔离开来,而不是您的代码存在问题。
  • 我会说“管理器”线程或响应器线程被保留是很常见的。毕竟,您可能想要进行另一个 SOAP 调用,这样可以节省设置时间。我会查看库源代码,看看它实际上做了什么。这会告诉你到底发生了什么。

标签: delphi soap


【解决方案1】:

应用程序的其他部分正在引用 SOAP 堆栈中的某些内容。在剩下的清理工作发生之前,这些线程不会消失。

如果重复调用 SOAP 函数会发生什么?它是每次继续增长 3 还是稳定下来?如果它继续增长,你有事可做。如果不是,它是一个低级功能,(可能)不是你的问题。密切关注内存,看看它是否会随着时间的推移而泄漏(尤其是当你敲击它时)。

【讨论】:

  • 每个请求的线程数(第二次调用后)增加和减少 2,关于内存泄漏:我不确定它是否泄漏,我会在一两天内知道。
  • 使用 'perfmon' 找出是否有任何泄漏
  • 能否提供链接?
  • 'perfmon' 是一个 Windows 应用程序。只需“开始”、“运行”、“性能监控” - 按进程、系统等查找要监控的不同事物。
  • 哦,我的错,我以为您指的是第三方专家/插件,它可以帮助查找内存泄漏
猜你喜欢
  • 2017-01-06
  • 2011-08-26
  • 2018-11-17
  • 2014-01-14
  • 2020-07-02
  • 2022-12-12
  • 2021-10-22
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多