您好,
我有一个ASP.NET应用程序,我添加了一个包含“fire and forget”方法的Webservice。执行此方法时,它将启动一个循环(0-99999),对于每个循环,它将读取一个xml文件并将其保存到数据库中。
问题是此操作需要几个小时,通常以线程中止异常结束?
我已经看到你可以增加executionTimeout,这就是:
<httpRuntime executionTimeout="604800"/>
<compilation debug="true">
但这没有用?
我还尝试在循环中添加thread.sleep。如果我将它设置为500它将会进入一半,如果我设置&lt; 100,它将在线程中止异常之前进行几次1000循环?
我该如何解决这个问题?
答案 0 :(得分:8)
不要在Web服务中运行循环。相反,它在控制台应用程序,winforms应用程序,甚至可能是Windows服务。使用Web服务启动其他程序。
Web服务基本上是一个网页,而asp.net网页并不意味着托管长时间运行的进程。
本文并未直接回答您的问题,但包含与我的回答相关的一小段信息:
http://msdn.microsoft.com/en-us/magazine/dd296718.aspx
但是,当持续时间 手术比手术长得多 典型的ASP.NET会话持续时间(20 分钟)或需要多个演员 (在我的招聘示例中),ASP.NET 没有提供足够的支持。您 可能还记得那个ASP.NET工作者 进程自动关闭 闲置并定期回收 他们自己。这会造成很大的影响 长期运营的问题, 作为国家在这些进程中举行 将失去。无论如何,这篇文章很好读。它可能会为您提供想法。
答案 1 :(得分:0)
不确定这是否是“答案”,但是当您收到Web服务调用时,您可以考虑将操作分派到另一个线程。然后可以运行直到完成。您可能想要考虑如何确保某人不会同时启动其中两个进程。
答案 2 :(得分:0)
我有一个ASP.NET应用程序 添加了包含的Web服务 一种“即发即忘”的方法。当这个 方法执行它会启动一个 循环(0-99999)并为每个循环它 将读取一个xml文件并保存到 数据库。
让我们不要进入我这种方法的背后......嗯...因为很多原因而糟糕(比如重置之中)。我会将请求排队,然后返回,并让队列侦听器以事务完整性进行处理。
无论如何,你能做的是:
除此之外,Web服务和类似的东西不适合每小时长时间运行的进程。勾选工作流程,单独处理。