ASP.NET 3.5 web 应用程序必须启动几个需要数小时才能完成的任务。出于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有人愿意等待那么长时间才能获得响应,因此任务必须是异步的。
有一个 Helper 类来处理所有这些长时间运行的任务。目前调度和执行这些任务的主要方法如下:
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 操作等。
更新:决定
谢谢大家的回复。现在我不知道将哪个问题标记为答案。所有这些都是有效的,并且是解决这个问题的可能方法。将等待今天并将得票最多的答案标记为答案,如果平局,我将选择第一个显示的答案,通常它们按最相关的顺序排列。
对于任何想知道我选择的解决方案的人,再次由于时间限制,是更改 IIS 回收配置,但我认为是理想的解决方案,基于我的研究,当然还有下面的答案,是创建一个“Worker Service”,并使用 ASP.NET App 和新的“Worker Service”之间的通信解决方案来协调要完成的长时间运行的工作。
最佳答案
您可以在其自己的应用程序域中启动长时间运行的进程。
过去,当我需要此功能时,我会为此目的创建一个 Windows 服务。如果您使用 WCF 连接到它,它甚至根本不必在 IIS 机器上运行;您可以在网络上的任何机器上运行它。
关于c# - ASP.NET 长时间运行的任务。线程正在中止异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254567/