当前位置: 首页 > 编程语言 > C#

ASP.NET长时间运行的任务,线程正在中止异常共享

时间:2023-04-10 22:55:35 C#

ASP.NET长时间运行的任务。线程正在中止异常ASP.NET3.5webapp必须启动几个需要数小时才能完成的任务。出于显而易见的原因,启动这些任务的页面不能等待它们完成,也没有人愿意等待那么长时间来等待响应,因此任务必须是异步的。有一个Helper类来处理所有这些长时间运行的任务。目前主要调度执行这些任务的方法如下:if(notAlreadyRunning){线程工作者=null;worker=newThread(()=>{try{action();}catch(Exceptione){Log.LogException(e,"Worker");}TasksAsync.RemoveTask(task);workers.Remove(worker);});workers.Add(工人);工人.开始();}返回notAlreadyRunning;在早期的实现中,我们使用了ThreadPool.QueueUserWorkItem方法,但结果始终相同:在aprox之后。20-30分钟一个线程中止并抛出异常。有谁知道为什么会这样?或者如何预防?更多信息:更新:决定谢谢大家的回复。现在我不知道将哪个问题标记为答案。所有这些都是有效的并且可以解决问题。将等待今天并以最高票数回答,如果出现平局,我将选择显示的第一个答案,通常它们按最相关的顺序排序。对于任何想知道我选择的解决方案的人,再次由于时间限制,是更改IIS回收配置,但我认为理想的解决方案,根据我的研究,当然还有下面的答案,是创建一个“工作服务”,并在ASP.NET应用程序和新的“作业服务”之间使用通信解决方案来协调要完成的长时间运行的作业。您可以在自己的应用程序域中启动长时间运行的进程。过去,当我需要这个功能时,我会为它创建一个Windows服务。如果您使用WCF连接到它,它甚至根本不必在IIS机器上运行;您可以在网络上的任何计算机上运行它。您可以通过提高超时时间、使用不同的应用程序池或各种其他技巧来做到这一点,但最好的办法是将长时间运行的任务与UI和ASP.NET完全分开,并使用服务(不推荐)或轮询工作的计划任务;我个人会使用awssqs/sns之类的东西来跟踪要完成的工作和Windows服务器中的计划任务,以任何合理的频率检查事情。ui/asp.net唯一需要做的就是记录需要做某事的事实,而不是实际去做。这种基于消息的方法的另一个好处是,如果一个长时间运行的进程变得如此长时间运行或过度工作,您就有机会添加更多的工作任务或服务器来满足这些请求。也许您可以针对眼前的问题实施更多措施,但需要考虑更好的长期解决方案。以上就是C#学习教程:ASP.NET长时间运行的任务。该线程正在挂起异常共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: