我的公司有一个应用程序,可以跟踪托管在各种机器上的网站的相关信息。中央服务器运行一个windows服务,该服务获取要检查的站点列表,然后查询在这些目标站点上运行的服务,以获取可用于更新本地数据的响应。
我的任务是将多线程应用于该进程,以减少运行所有站点所需的时间(大约3000个站点需要大约8个小时才能按顺序运行)。当服务不是多线程的时候,它可以成功地运行,但当我将工作分散到多个线程(现在用3个线程进行测试,再加上一个观察线程)时,出现了一个奇怪的崩溃,似乎源于对应该提供数据的远程服务的调用。这是一个SOAP/XML调用。
当在测试服务器上运行时,服务只是放弃并没有完成任务,但不会停止运行。当运行调试器(Dev Studio 2010)时,整个过程就停止了。我将运行它,几秒钟后它将停止调试,但不是因为它完成了。它不会抛出异常,也不会给我任何信息。有了断点,我可以一直走到它刚刚停止的地方。事件日志将我带到同一个位置。它停在试图从其他网站上的web服务获得响应的代码行上。再说一遍:它只有在多线程的情况下才会这样做。
我发现一些信息表明,默认为2的连接数是有限制的。建议的解决方案是在app.config中添加一些标记,但这并没有解决问题。。。
<system.net>
<connectionManagement>
<add address="*" maxconnection="20"/>
</connectionManagement>
</system.net>
我仍然认为这可能与允许的连接数量有关,但我一直无法很好地在网上找到有关它的信息。我有没有遗漏一些直截了当的东西?任何帮助都将不胜感激。
- 无论多么奇怪的崩溃都不会从堆栈转储中逃脱。试着浏览一下这个转储,看看它是否指向了一些明显的功能
- 您是否在实际的服务呼叫中使用某些第三方工具或其他组件?如果是,请检查文档/联系编写人员,以确认其组件是线程安全的。如果没有,那么您将面临艰巨的任务。:)(我研究过不安全的DB,所以相信我,发现一些全局静态变量并不罕见。)
最后,如果你100%确定这是由于多个线程造成的,那么在你的工作线程中加一个锁。最初说它覆盖了整个主while循环。值得注意的是,它不应该崩溃,即使它是多线程的,你也已经序列化了执行。下一步是缩小到线程的范围。例如main while循环,比如f1()、f2()、f3(),然后在f1未锁定的情况下开始锁定f2()和f3(。。。若一切顺利,那个么问题就出在f2或f3()中。我希望你知道我的建议
我知道这就像盲人在猜测大象,但如果你的代码使用了很多没有充分文档的外部组件,这是你能做的最好的事情。