c# - ASP.NET 长时间运行的任务。线程正在中止异常

标签 c# asp.net asynchronous

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/

相关文章:

c# - 什么是 IndexOutOfRangeException/ArgumentOutOfRangeException 以及如何修复它?

c# - 多行变成单行多列

c# - 为什么异步方法调用者的行为很奇怪?

java - 服务器忙于处理长事务时如何响应客户端

java - CompletableFuture 和垃圾回收

C# 如何在不知道您使用的是哪个 poco 的情况下将 Poco 转换为 List<Poco>

c# - MMORPG 开发和服务器端逻辑,更新所有游戏对象?

asp.net - 在线控件属性编辑器,类似于 Visual Studio 中的控件属性编辑器

asp.net - 鼠标悬停时显示大量文本

c# - 使用 itextsharp 将转发器控件转换为 pdf 每个重复的内容都应该出现在新页面中