在Windows服务中运行的线程中最终不会执行

Sti*_*tig 16 c# windows-services timer try-catch-finally

任何人都可以解释为什么这个finally块没有被执行?我已经阅读了关于何时期望最终阻止不被执行的帖子,但这似乎是另一种情况.此代码需要TopShelf和log4net.我正在运行.net 4.5

我想它必须是Windows服务引擎启动未处理的异常,但为什么它在finally块完成之前运行?

using log4net;
using log4net.Config;
using System;
using System.Threading;
using Topshelf;

namespace ConsoleApplication1
{
    public class HostMain
    {
        static void Main(string[] args)
        {
            HostFactory.Run(x =>
            {
                x.Service<HostMain>(s =>
                {
                    s.ConstructUsing(name => new HostMain());
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });

                x.RunAsLocalSystem();
                x.SetServiceName("TimerTest");
            });
        }

        public void Stop()
        {
            LogManager.GetLogger("MyLog").Info("stopping");
        }

        public void Start()
        {
            XmlConfigurator.Configure();

            LogManager.GetLogger("MyLog").Info("starting");

            new Thread(StartServiceCode).Start();
        }

        public void StartServiceCode()
        {
            try
            {
                LogManager.GetLogger("MyLog").Info("throwing");

                throw new ApplicationException();
            }
            finally
            {
                LogManager.GetLogger("MyLog").Info("finally");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

starting
throwing
stopping
Run Code Online (Sandbox Code Playgroud)

编辑:请评论你降级的原因,也许你不明白这个问题?我在这看到一个大问题.您编写了一些域逻辑,它在Exception的finally子句中执行重要的操作.然后,如果您在Windows服务中托管逻辑,则设计突然中断.

Aka*_*ava 8

来自MDSN try-finally(C#参考)

在处理的异常中,保证运行关联的finally块.但是,如果未处理异常,则finally块的执行取决于如何触发异常展开操作.反过来,这取决于您的计算机的设置方式.有关更多信息,请参阅CLR中的未处理异常处理.

通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要

这是设计,.NET选择终止你的应用程序,原因是,有一些非常错误的东西,一些东西没有按预期工作,通过最后调用,我们不想做更多的损害,所以最好是结束应用程序.

如果最终再引发一个例外,该怎么办?如果应用程序即将关闭,它可能已关闭或开始关闭托管资源并访问它们以便最终登录也可能会致命.