C# ASP.NET长期运行任务。正在中止线程异常
ASP.NET 3.5 Web应用程序必须启动几个需要数小时才能完成的任务。由于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有人希望等待那么长时间才能得到响应,因此这些任务必须是异步的 有一个助手类来处理所有这些长时间运行的任务。目前,安排和执行这些任务的主要方法如下:C# ASP.NET长期运行任务。正在中止线程异常,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,ASP.NET 3.5 Web应用程序必须启动几个需要数小时才能完成的任务。由于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有人希望等待那么长时间才能得到响应,因此这些任务必须是异步的 有一个助手类来处理所有这些长时间运行的任务。目前,安排和执行这些任务的主要方法如下: public static bool ScheduleTask(TaskDescriptor task, Action action) { bool notAlreadyRunning = TasksAsy
public static bool ScheduleTask(TaskDescriptor task, Action action)
{
bool notAlreadyRunning = TasksAsync.TryAdd(task);
if (notAlreadyRunning)
{
Thread worker = null;
worker = new Thread(() =>
{
try { action(); }
catch(Exception e)
{
Log.LogException(e, "Worker");
}
TasksAsync.RemoveTask(task);
workers.Remove(worker);
});
workers.Add(worker);
worker.Start();
}
return notAlreadyRunning;
}
在早期的实现中,我们使用了ThreadPool.QueueUserWorkItem
方法,但结果总是一样的:在aprox之后。20-30分钟线程被中止异常被抛出
有人知道为什么会这样吗?或者如何预防
更多信息:
- IIS标准配置
- 任务可以是任何东西,查询数据库和/或IO操作等
<> P>对于任何想要了解解决方案的人,我再次选择,由于时间限制,要改变IIS回收配置,但基于我的研究和下面的答案,我认为最理想的解决方案是创建一个“工人服务”,并在ASP.NET应用程序和新的应用程序之间使用通信解决方案。“辅助服务”来协调要完成的长时间运行的工作。您可以在其自己的应用程序域中启动长时间运行的流程
过去,当我需要此功能时,我会为此创建一个Windows服务。如果您使用WCF连接到它,它甚至不必在IIS机器上运行;您可以在网络上的任何机器上运行它。通过增加超时时间、使用不同的应用程序池或各种其他hac,您很可能可以实现此功能ks,但您最好将长时间运行的任务与ui和asp.net完全分离,并使用其中一种服务(不推荐)或者是轮询要做的工作的计划任务;就我个人而言,我会使用类似aws sqs/sns的工具来跟踪要做的工作,并在windows server中使用计划任务,以任何有意义的频率检查要做的事情。ui/asp.net唯一需要做的就是记录需要做的事情,而不是实际做 这种基于消息的方法的另一个好处是,如果长时间运行的流程变得如此长时间运行或工作过度,您将有机会添加更多的辅助任务或服务器来完成这些请求
也许比你能立即解决的问题要多,但要考虑一个更好的长期解决方案。
你的IIS AppSoops/WorksRealiver?IIS配置是IIS 7的标准配置。所以,是的,我猜。自从我在ASP.NET中已经有一段时间以来,已经有一段时间了,但是如果内存服务,当工人处理ReCy时。cle他们可以停止线程。尝试禁用循环,看看这是否是线程中止的原因。(如果是这样的话,还不确定解决方法;正如我所说,还没有涉及到这个特定问题)Phill Haack在他的帖子中深入探讨了这个问题。希望它能帮助你通过以下思路禁用应用程序池回收:但我确实认为最好的方法是按照Robert的建议在不同的应用程序域上运行。我认为你是对的,这将是应该采取的方法,但由于时间限制,我认为我们不能这样做。我不这么认为I don’我不认为你真的有选择的余地。菲尔·哈克(Phil Haack)明确表示,IIS并不是专为实现这一点而设计的。你可以尝试在一个新的appdomain中旋转一个线程:我不知道你可以像那样动态创建一个appdomain……我想我会读到这方面的内容。但是如果你能帮我省下一点研究,当thread结束?基本上我如何确保释放新appdomain的资源?回到“旧时代”“我们使用COM+和MSMQ来完成这种长时间运行的过程。我认为WCF和基于服务的建议应该可以很好地发挥作用。如果您愿意,您可能仍然可以使用MSMQ。@jfrankcarr:使用.NET远程处理很容易,但不管出于什么原因,这种技术已经不再流行了。WCF是新的黑色。