加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:22:03 所属栏目:百科 来源:网络整理
导读:ASP.NET 3.5 webapp必须启动几个需要几个小时才能完成的任务.出于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有任何人想要等待那么长时间才能获得响应,因此任务必须是异步的. 有一个Helper类来处理所有这些长时间运行的任务.计划和执行这些任
ASP.NET 3.5 webapp必须启动几个需要几个小时才能完成的任务.出于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有任何人想要等待那么长时间才能获得响应,因此任务必须是异步的.

有一个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回收配置,但我认为是理想的解决方案,基于我的研究,当然下面的答案,是创建一个“工作服务”并使用ASP.NET应用程序和新的“工作服务”之间的通信解决方案来协调要完成的长时间工作.

解决方法

您可以在自己的应用程序域中启动长时间运行的进程.

过去,当我需要此功能时,我会为此创建一个Windows服务.如果您使用WCF连接到它,它甚至根本不必在IIS机器上运行;您可以在网络上的任何计算机上运行它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读