我正在使用VSTS 2008 + C#+ .Net 3.5来开发Windows服务应用程序。下面的代码非常简单,我发现当File.Copy抛出异常(例如路径无效,没有权限等)时,服务将崩溃并弹出一个对话框让我调试。我的困惑是,我认为由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()
{
}
}
答案 0 :(得分:6)
我认为由Windows服务创建的线程的未处理异常永远不会使服务崩溃
你的假设完全错了。 Windows服务中未处理的异常将导致其崩溃。出现调试对话框,因为系统上配置了调试器。从.NET 2.0开始,任何线程上的未处理异常都会关闭整个应用程序。仅仅因为你正在使用一个线程并不意味着线程中的异常会神奇地消失。
答案 1 :(得分:2)
您的文件复制操作正在抛出一个未被捕获的异常。就那么简单。除非您在try catch块中包装File.Copy操作,否则该服务将失败。在后台线程上执行操作并不重要。我还建议添加一些日志记录,否则你将无法发现它失败的原因。
答案 2 :(得分:0)
启动一个新线程以在WriteF中运行代码。如果此代码因异常而失败,则运行时将尝试通过展开该特定线程的堆栈来查找异常处理程序。如果找不到处理程序,则运行时没有选项,但报告是未处理的异常,因此进程终止。记住异常处理是每个线程。这不是Windows服务问题。