Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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_Multithreading_Application Lifecycle - Fatal编程技术网

C# 应用程序结束和后台进程,优雅地退出ASP.Net应用程序

C# 应用程序结束和后台进程,优雅地退出ASP.Net应用程序,c#,asp.net,multithreading,application-lifecycle,C#,Asp.net,Multithreading,Application Lifecycle,我有一个ASP.Net应用程序,它使用ThreadPool.QueueUserWorkItem()激发一些后台工作人员。大多数情况下,运行的后台线程将为零,但有时可能一次执行多达5-6个线程。此外,大多数将在几秒钟内完成,但它们可能运行长达10分钟 给出了所有可能导致ASP.NET应用程序关闭的场景,如果这些应用程序需要关机,并且它们在处理过程中,那么我希望这些后台进程可以优雅地退出。p> 我不认为会有太多的问题,因为会产生一种方法来通知流程提前停止工作,并在接到应用程序正在关闭的呼叫后几秒钟内

我有一个ASP.Net应用程序,它使用ThreadPool.QueueUserWorkItem()激发一些后台工作人员。大多数情况下,运行的后台线程将为零,但有时可能一次执行多达5-6个线程。此外,大多数将在几秒钟内完成,但它们可能运行长达10分钟

给出了所有可能导致ASP.NET应用程序关闭的场景,如果这些应用程序需要关机,并且它们在处理过程中,那么我希望这些后台进程可以优雅地退出。p> 我不认为会有太多的问题,因为会产生一种方法来通知流程提前停止工作,并在接到应用程序正在关闭的呼叫后几秒钟内进行清理。如果有人对此有具体的建议,我当然会非常感激

我的两个主要问题是:

1) 什么时候是告诉后台工作人员结束工作的合适时间。在应用程序结束时?Dispose()?或者是我不知道的第三种选择

2) 如果我在上述事件中等待进程在返回之前完成,那么如果不立即返回Application\u End,是否会比不关闭后台作业对应用程序造成更严重的问题

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

谢谢

合适的时间在应用程序端

现在,在你给你的背景工作发信号之后,你必须等待他们在那一点结束,然后继续,就像你看起来做的那样

在我的例子中,最好是在等待上放置一个超时,不要一直等待,否则您的池可能会出现问题,或者关闭,然后您需要检查最大等待上的池设置以关闭池,设置的值大于您的等待,或者只是将其禁用

在我的例子中,如果你有pool garden(超过1个工作池),那么每个池调用一次应用程序_End


我在我的网站上使用同样的技术,同样的方式我发信号让我的线程停止,同样的方式,我只是记录最后的结束,并检查它们何时是最后的结束,我还强制我的例程停止,并且不让它们运行很多次。在回收池、打开app_offline.htm文件或关闭web服务时调用应用程序_End。就我个人而言,我已禁用回收,我不需要它们,我只在更新时打开app_offline.htm。在那一刻,我等待池线程停止工作。

感谢Aristos,应用程序池的“关机时间限制”属性正是我需要知道的。(也就是说,如果进程没有在这段时间内很好地关闭,进程将终止,在我的情况下是90秒)。接下来的问题是,我真的有必要让申请结束,直到工人的工作清理完毕,然后再回来吗?或者,我可以让它发出信号让工作人员开始清理并让应用程序在该点返回吗?@eoldre是的,必须等待,否则终止线程。当应用程序结束时,工作池被终止,所有线程都消失。如果您更改和更新Dll或web上的页面,也会发生同样的情况。