【发布时间】:2014-12-04 13:04:53
【问题描述】:
我有一个具有自定义内部线程的 ASP.Net 网站,用于定期执行的任务。
如果我在其中一个线程上遇到异常,它不会被 Global.ASAX 的 Application_Error() 函数捕获。它被允许冒泡到 IIS,我通过查看事件查看器日志来了解它。如果我发现异常,那么 Log4Net 会向我发送一封电子邮件,我应该会相对较快地发现错误。
有没有办法在这些线程上捕获异常?该应用程序需要“始终在线”,因此丢弃该应用程序的异常是一个显示停止器。
【问题讨论】:
-
我认为理想的方法是从 Web 应用程序中完全删除定期运行的后台任务,并将它们移动到 Windows 服务或计划的控制台应用程序之类的东西上。然后,您可以在那些更适合长时间运行的后台任务的应用程序主机上处理异常。
-
是的,虽然有点重写。必须有某种方法来捕获不是请求线程异常的线程异常?
-
这里似乎有一些很好的信息:stackoverflow.com/q/186854/328193 我认为除了将关注点分离到适当的应用程序主机之外,最好的建议是确保线程不会抛出未处理的例外。每个线程可能都有一个顶级“worker”代码块,它应该捕获所有异常并将它们传达回父线程。不过,我认为您会遇到的问题是通信机制。什么是网络应用程序中的父线程?它真的不适合后台线程。
-
同意,例外是不好的。我正在使用 MySQL,偶尔(最多一个月一次)我会遇到数据库异常。这是一个严重错误,必须停止应用程序,强制注意并重新启动。我正在寻找以我的方式发送该错误,以便我可以进行干预。现在,我将数据库交互包装在 try-catch 块中,并希望 log4net 存在足够长的时间来给我发邮件。
-
听从 David 的建议,创建一个 Windows Server 或类似的东西。我不得不清理在几个大型网站上启动线程的混乱,只是不要这样做,您的后台线程可能会关闭您的整个网站。
标签: asp.net multithreading exception