为什么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() 
     { 
     } 
    } 
+1

错误...因为它有一个错误? – wefwfwefwe 2009-09-22 09:42:55

+0

虚拟gzillions的点。激励的答案在哪里?我认为这是另一回事。 – Khash 2010-06-10 14:53:58

我想通过一个Windows服务创建一个线程未处理的异常不会让服务崩溃

你的假设是完全错误的。 Windows服务中的未处理异常将导致其崩溃。出现调试对话框是因为您的系统上配置了调试器。从.NET 2.0开始,任何线程上的未处理的异常都会关闭整个应用程序。仅仅因为你使用线程并不意味着线程中的异常会神奇地消失。

+0

从Windows服务的任何线程抛出的异常将使Windows服务崩溃? – George2 2009-09-22 09:55:36

+2

是的。这不是服务所特有的,对任何应用程序来说都是一样的。 – blowdart 2009-09-22 10:01:27

+0

谢谢,问题回答! – George2 2009-09-22 10:08:38

您的文件复制操作正在抛出一个未被捕获的异常。就那么简单。除非在try catch块中包装File.Copy操作,否则该服务将失败。操作在后台线程上执行并不重要。我还建议增加一些日志,否则你不会发现它失败的原因。

+1

我不确定这是否一样,但是我们之前已经从一个服务中创建了一个线程主线程(运行时不会阻塞服务)。然后它将检索用户列表,并循环用户,为每个用户创建一个线程来执行任务。在线程有未处理的异常的事件中,其他线程disd完成。我在做什么,或者这与问题的内容有何不同? – 2009-09-22 09:39:51

+0

从Windows服务的任何线程抛出的异常将使Windows服务崩溃? – George2 2009-09-22 09:56:08

您启动了一个用于在WriteF中运行代码的新线程。如果此代码在发生异常时失败,则运行时将尝试通过展开该特定线程的堆栈来查找异常处理程序。如果它在查找处理程序时失败,那么运行时没有选项,只能报告一个未处理的异常,从而终止该进程。记住异常处理是每个线程。这不是Windows服务问题。