2014-10-09 79 views
0

我有一个ASP.Net网站具有自定义内部线程,用于定期发生的任务。ASP.Net C#4.0 - 如何捕获应用程序线程异常

如果我在其中一个线程上遇到异常,它不会被Global.ASAX的Application_Error()函数捕获。它允许冒泡到IIS,并通过查看事件查看器日志来了解它。如果我发现异常,Log4Net会发送一封电子邮件给我,我应该相对快速地发现错误。

有没有一种方法可以捕获这些线程的异常?该应用程序需要“始终开启”,因此导致应用程序掉线的例外情况是显示停止。

+5

我想,理想的方法是从Web应用程序中完全移除周期性运行的后台任务,并将它们移动到Windows服务或预定的控制台应用程序之类的位置。然后,您可以在那些更适合长时间运行的后台任务的应用程序主机上处理异常。 – David 2014-10-09 14:38:29

+0

是的,虽然有一点重写。必须有某种方法来捕获不是请求线程异常的线程异常? – 2014-10-09 16:24:59

+0

在这里似乎有一些很好的信息:http://stackoverflow.com/q/186854/328193我认为最好的建议,除了将问题分离到适当的应用程序主机之外,将是确保线程不会抛出根本没有处理的例外。每个线程大概都会有一个顶级的“worker”代码块,它应该捕获所有异常并将它们传回给父线程。我认为你遇到的问题就是沟通机制。 *是Web应用中的父线程?它真的不适合后台线程。 – David 2014-10-09 16:27:24

回答

0

在评论你提到:

这是一个网站,而不是Web应用程序。

“网站”与“网络应用程序”似乎在这一点上是一个模拟的区别。代码中有足够的复杂性,它几乎是任何单词的定义都是“应用程序”。至此,如果应用程序主机没有为您有效地管理线程错误(并且我不希望Web应用程序主机这样做),那么您必须手动管理它们。

在这种情况下,我认为这是两个选项之一:

选项1:不要让你的线程故障状态结束。无论您的任何给定线程的顶级工作程序项是什么(在线程开始时调用一个方法,循环重复操作等),都需要具有基本的防错能力。没有例外应该过去。这意味着它需要变得简单(以避免抛出它自己的异常),并且需要捕获它调用的操作中的任何和所有异常。

一旦被发现,请随意处理。回滚工作单位,将错误通知人等

选项2:移动长期运行线程运算出来的Web应用程序,因为Web应用程序是不是真的适合正在进行的后台进程。 Windows服务或计划的控制台应用程序是该逻辑更合适的应用程序主机。

是的,有点重新写在那里。

是吗?它不应该。这实际上是代码最初是如何构建的,与应用程序主机本身无关。从一个应用程序主机调用业务操作与从另一个应用程序主机调用业务操作相同。如果逻辑与应用程序技术紧密耦合,那么这是一个单独的问题。并没有解决这个问题的快速解决方案。好消息是,一旦您修复问题,其他问题(如提示此问题的问题)均为快速修复。

+0

好吧,今天我已经把所有的应用程序代码塞进一个单独的程序集中,现在使用预温缓存技术来启动应用程序,而不是使用poke scipt的onDemand方法。所以这个站点是一个准服务,IIS保持它始终运行。我将不得不抓取可能暴露于未捕获数据库故障的代码,并花一些时间打开和关闭数据库。乐趣。感谢您的协助。 – 2014-10-10 15:50:21

相关问题