应用程序终止(Application_End)未运行

5

我刚开始接触C#,请多包容。

我有一个函数在Global.asax.cs文件的Application_Start函数中运行,当我开始调试时它能够正常工作。

但是当我停止调试时,我在Application_End函数中设置的函数似乎没有执行。我想知道这是否与调试有关,还是只是我的代码出现了错误。


很有可能您的应用程序仍在运行。您是否检查了系统托盘中正在运行的 IIS Express 实例是否已完全关闭?您是在完整的 IIS 中托管它吗? - Simon Whitehead
我正在使用IIS Express进行托管,但从事情的样子来看,我认为你是对的,我不认为它会停止。当我停止运行函数时,我需要执行此函数。你知道我该如何告诉它停止吗? - user3413723
@user3413723:你确定要在应用程序退出时结束它,而不是在会话结束时?你想执行什么样的操作? - Patrick Hofman
这是一个与API配合使用的asmx文件。我有一个“开始监听”函数和一个“停止监听”函数,需要在程序开始和结束时执行。 - user3413723
1
@user3413723 如果它不停止监听,那又有什么关系呢?整个AppDomain都将被拆除并进行清理。Listen()是否会锁定Web服务远程端的资源?如果是这样,那么对于Web服务来说,这可能是一个糟糕的设计。 - Chris Marisic
3个回答

3
我猜测应用程序从未结束。在您进行调试(使用Cassandra或IIS Express)或在IIS本身上运行安装时,应用程序不会在调试会话结束时结束。
在IIS上,它将在工作进程停止时结束。这取决于您的应用程序池设置,一段时间后会自动发生。
在Cassandra和IIS Express中,它将在进程正常结束时结束。我想知道它们是否会定期调用这些安装程序。

2

我曾遇到过类似的问题,其中Application_End没有被调用,因为应用程序被要求停止时仍有线程在运行,并且因为该方法只在所有东西都停止正常后才会被调用。

然后,我发现了Application_Disposed。来自http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721/

Application_Disposed:在应用程序被销毁之前触发。这是清理以前使用的资源的理想位置。


5
这篇文章是错误的(至少对于IIS 8来说)。Application_Disposed会针对每个应用程序类的实例进行调用,而Application_End只会在整个AppDomain中调用一次。来源:个人经验 - user3608068
似乎在IIS Express上调试Application_Disposed方法每10-30秒就会被调用。 - andrew pate

1
一般来说,在Application_End中放置大量需要依赖触发的代码并不是一个好主意。请注意,每个线程的工作进程都会启动一个ApplicationInstance来服务您的应用程序,因此在繁忙的网站上,随着流量的涨落,您的Application_End将被频繁调用。
您可能会发现,使用具有滑动过期时间和回调函数的Cache对象更容易,当对象从Cache过期时,可以确保在需要时正确调用清理代码。

http://msdn.microsoft.com/en-us/library/05kd8d77(v=vs.110).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接