Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET长期运行任务。正在中止线程异常_C#_Asp.net_Asynchronous - Fatal编程技术网

C# ASP.NET长期运行任务。正在中止线程异常

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

ASP.NET 3.5 Web应用程序必须启动几个需要数小时才能完成的任务。由于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有人希望等待那么长时间才能得到响应,因此这些任务必须是异步的

有一个助手类来处理所有这些长时间运行的任务。目前,安排和执行这些任务的主要方法如下:

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是新的黑色。