服务调用在主线程中工作,但在多线程时崩溃

时间:2011-07-01 13:34:17

标签: c# multithreading web-services crash two-connection-limit

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

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

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

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

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

我仍然认为它可能与允许的连接数有关,但我无法在网上很好地找到它周围的信息。有什么直截了当的我错过了吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  1. 没有崩溃,但奇怪的是逃脱堆栈转储。尝试浏览那个转储,看看它是否指出了一些明显的功能。
  2. 您是否在实际服务电话中使用某些第三方工具或其他组件?如果是,那么请检查文档/ contact-the-person-who-write-it,以确认其组件是线程安全的。如果他们不是,那么你将面临巨大的任务。 :)(我已经研究过不安全的数据库,所以请相信我发现几个全局静态变量并不是很常见..)
  3. 最后,如果您100%确定这是由于多个线程,那么请锁定您的工作线程。最初说它涵盖了整个主循环。它不应该崩溃,即使它是多线程的,你已经序列化了执行。 下一步是减少线程的范围。说,有三个功能 main-while-loop,比如说f1(),f2(),f3(),然后开始锁定f2()和f3(),同时让f1解锁...如果事情有效,那么问题就在f2或f3的某处( )。  我希望你能了解我的建议

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