2010-11-12 22 views
1

我的c#windows服务正在死亡,原因是它创建的其中一个工作线程中有一个未知错误。找出哪些错误终止了c#windows服务的最佳方法?

有什么办法找出导致服务终止的异常吗?

(没有写一打try/catch /记录错误代码)。

只是一个关于导致服务关闭的错误的简单的一次性报告。

回答

2

很简单,为AppDomain.CurrentDomain.UnhandledException实现事件处理程序并记录e.ExceptionObject.ToString()的值。

+0

谢谢。我会立即采取行动。 – bboyle1234 2010-11-13 03:15:41

0

有几件事你可以做。首先,检查Windows错误日志,如果你还没有 - 我知道这可能是显而易见的,他们可以对信息稍微有点亮,但它总是值得一看,因为偶尔它会有帮助。

第二种方法只涉及一点点,我知道你已经要求一些非常快速和一次性的东西,但说实话,我正要推荐开发Windows服务的最佳方法,并且一旦你做到了,你将永远不会回去......和这将节省您的痛苦的时间,所以我无论如何给你的建议是:

提取服务为核心,以独立运行在一个简单的控制台应用主机。这种方法意味着您可以在Visual Studio中完全运行和调试它,作为普通的旧可执行文件运行,或者甚至在连接了远程调试会话的测试服务器上运行。对于真正的“实时”Windows服务,您的服务代码是可测试,可调试的服务核心的薄包装。这对我来说一次又一次。

您的核心服务将公开可由生产中的Windows服务主机调用的Start()和Stop()方法。而已。

有一个非常好的OSS项目叫做Topshelf,它提供了我描述过的包装器的全功能和经过充分测试的版本,您可以阅读开发人员使用它的示例here

+0

谢谢斯科特。我会检查你的链接 – bboyle1234 2010-11-13 03:07:03

0

我想说,增加一打trycatch以便下一次出现问题时,您可能会记录错误日志(如果您稍后发现某个问题有时会发生在调试时难以重现的不清楚的情况下)。

但是,除此之外,您可以将Visual Studio附加到正在运行的进程,如this MSDN文章中所示。为了避免这样做,我通常会在服务启动时添加一些代码,以便如果exe以-c命令行参数启动,它将作为可以从Visual Studio启动的正常进程运行。这Code Project article显示了类似的东西。

0

简单的方法是将错误从VS传输到Windows错误日志并在那里检查。如果您希望将错误日志列表作为报告,则必须使用一些第三方工具。 Logger in c#

如果你喜欢去更简单/更便宜的尝试上面的代码。它比你想象的容易和简单