Hi,
我有一个ASP.NET应用程序,其中我添加了一个Webservice,其中包含一个"fire和that“方法。在执行此方法时,它将启动一个循环(0-99999),对于每个循环,它将读取一个xml文件并将其保存到数据库中。
问题是,这个操作需要几个小时,并且通常以线程中止的异常结束?
我已经看到,您可以增加executionTimeout,这是如何:
<httpRuntime executionTimeout="604800"/>
<compilation debug="true">但这没有帮助吗?
我还尝试在循环中添加一个thread.sleep。如果我把它设置为500,它会走一半路,如果我设置了<100,它将在线程中止异常之前执行几个1000个循环?
我怎么才能解决这个问题?
发布于 2010-12-27 14:17:55
不要在web服务中运行循环。相反,将其放在控制台应用程序、winforms应用程序中,甚至可能是windows服务中。使用web服务启动另一个程序。
web服务基本上是一个网页,而asp.net网页并不打算承载长期运行的进程。
本文没有直接回答您的问题,但是包含了与我的答案相关的信息片段:
http://msdn.microsoft.com/en-us/magazine/dd296718.aspx
但是,当操作的持续时间比典型的
会话持续时间(20分钟)长或需要多个参与者(如我的雇用示例)时,ASP.NET没有提供足够的支持。您可能还记得,ASP.NET工作进程会在空闲时自动关闭,并定期回收自身。这将给长期运行的操作带来很大的问题,因为这些进程中的状态将丢失。
无论如何,这篇文章读得很好。它可能会为你提供一些想法。
发布于 2010-12-27 14:20:05
不确定这是否是“答案”,但当您收到web服务调用时,您可以考虑将操作分派到另一个线程上。然后就可以运行到完成。但是,您可能需要考虑如何确保某人不会同时启动其中的两个进程。
发布于 2010-12-27 14:20:36
我有一个ASP.NET应用程序,其中我添加了一个Webservice,其中包含一个"fire和that“方法。在执行此方法时,它将启动一个循环(0-99999),对于每个循环,它将读取一个xml文件并将其保存到数据库中。
别说了,我很反对这种方法.嗯..。坏的原因有很多(比如事情的中间复位)。我将对请求进行排队,然后返回,并让队列侦听器处理事务完整性。
不管怎样,你能做的是:
除此之外,web服务和类似的东西对于每小时长时间运行的进程来说都不是一个好地方。勾选一个工作流,分别处理它。
https://stackoverflow.com/questions/4539277
复制相似问题