为什么Windows服务崩溃?
我正在使用VSTS 2008 + C#+ .Net 3.5开发Windows服务应用程序。下面的代码非常简单,我发现File.Copy抛出异常(例如路径无效,没有权限等)时,服务会崩溃并弹出一个对话框让我调试。我的困惑是,我认为由Windows服务创建的线程的未处理异常不会导致服务崩溃。为什么我的服务崩溃并且调试对话框弹出?为什么Windows服务崩溃?
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Thread t = new Thread (WriteF);
t.Start();
}
static void WriteF() {
File.Copy("dummy.txt", @"\\somelocation\dummy.txt");
}
protected override void OnStop()
{
}
}
我想通过一个Windows服务创建一个线程未处理的异常不会让服务崩溃
你的假设是完全错误的。 Windows服务中的未处理异常将导致其崩溃。出现调试对话框是因为您的系统上配置了调试器。从.NET 2.0开始,任何线程上的未处理的异常都会关闭整个应用程序。仅仅因为你使用线程并不意味着线程中的异常会神奇地消失。
您的文件复制操作正在抛出一个未被捕获的异常。就那么简单。除非在try catch块中包装File.Copy操作,否则该服务将失败。操作在后台线程上执行并不重要。我还建议增加一些日志,否则你不会发现它失败的原因。
我不确定这是否一样,但是我们之前已经从一个服务中创建了一个线程主线程(运行时不会阻塞服务)。然后它将检索用户列表,并循环用户,为每个用户创建一个线程来执行任务。在线程有未处理的异常的事件中,其他线程disd完成。我在做什么,或者这与问题的内容有何不同? – 2009-09-22 09:39:51
从Windows服务的任何线程抛出的异常将使Windows服务崩溃? – George2 2009-09-22 09:56:08
您启动了一个用于在WriteF中运行代码的新线程。如果此代码在发生异常时失败,则运行时将尝试通过展开该特定线程的堆栈来查找异常处理程序。如果它在查找处理程序时失败,那么运行时没有选项,只能报告一个未处理的异常,从而终止该进程。记住异常处理是每个线程。这不是Windows服务问题。
错误...因为它有一个错误? – wefwfwefwe 2009-09-22 09:42:55
虚拟gzillions的点。激励的答案在哪里?我认为这是另一回事。 – Khash 2010-06-10 14:53:58