2

我的公司有一个应用程序,可以跟踪与托管在各种机器上的网站相关的信息。中央服务器运行 Windows 服务,该服务获取要检查的站点列表,然后查询在这些目标站点上运行的服务以获取可用于更新本地数据的响应。

我的任务是对这个过程应用多线程,以减少运行所有站点所需的时间(几乎 3000 个站点需要大约 8 小时才能顺序运行)。该服务在不是多线程时成功运行,但是当我将工作分散到多个线程(现在使用 3 个测试,加上一个观察者线程)时,出现了一个奇怪的崩溃,似乎源于对远程服务的调用应该提供数据。这是一个 SOAP/XML 调用。

在测试服务器上运行时,服务只是放弃并且没有完成它的任务,但不会停止运行。当通过调试器(Dev Studio 2010)运行时,整个事情就停止了。我会运行它,几秒钟后它会停止调试,但不是因为它完成了。它不会抛出异常或给我任何类型的消息。有了断点,我可以走到它刚刚停止的地方。事件记录将我带到同一个地方。它停在试图从其他站点上的 Web 服务获取响应的代码行上。再说一遍:它只在多线程时才这样做。

我发现一些信息表明默认为 2 的连接数有限制。建议的解决方案是在 app.config 中添加一些标签,但这并没有解决问题......

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="20"/>
    </connectionManagement>
</system.net>

我仍然认为这可能与允许的连接数有关,但我一直无法很好地在网上找到有关它的信息。有什么简单的我想念的吗?任何帮助将非常感激。

4

1 回答 1

0
  1. 没有崩溃,但奇怪的是会逃脱堆栈转储。尝试浏览那个转储,看看它是否指出了一些明显的功能。
  2. 您是否使用第三方工具或其他组件进行实际服务调用?如果是,那么请检查文档/联系编写它的人,以确认它们的组件是线程安全的。如果他们不是,那么你有很大的任务。:) (我在不安全的数据库上工作过,所以相信我,发现一些全局静态变量并不少见..)

最后,如果您 100% 确定这是由于多个线程造成的,那么请在您的工作线程中加锁。最初说它涵盖了整个 main-while-loop。从理论上讲,即使它是多线程的,它也不应该崩溃,因为您已经序列化了执行。下一步是减少线程的范围。比如说,在 main-while-loop 中有三个函数,比如 f1()、f2()、f3(),然后开始锁定 f2() 和 f3(),同时让 f1 解锁……如果一切顺利,那么问题出在 f2 或 f3() 中。我希望你明白我的建议

我知道这就像盲人猜大象一样,但这是你能做的最好的事情,如果你的代码使用了很多没有充分记录的外部组件。

于 2011-08-27T22:02:25.523 回答