Finally wird in einem Thread, der in einem Windows-Dienst ausgeführt wird, nicht ausgeführt.

ann jemand erklären, warum dieser finally-Block nicht ausgeführt wird? Ich habe gelesen, wann der zu erwartende Block nicht ausgeführt werden soll, aber dies scheint ein anderer Fall zu sein. Dieser Code benötigt TopShelf und log4net. Ich verwende .net 4.5

Ich denke, es muss die Windows-Service-Engine sein, die unbehandelte Ausnahmen aktiviert, aber warum wird sie ausgeführt, bevor der Block finally abgeschlossen ist?

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");
            }
        }
    }
}

Ausgänge

starting
throwing
stopping

EDIT: Bitte kommentieren Sie, warum Sie ein Downgrade durchführen. Vielleicht verstehen Sie das Problem nicht? Ich sehe hier ein großes Problem. In der finally-Klausel zu Exception schreiben Sie eine Domänenlogik, die wichtige Funktionen ausführt. Wenn Sie dann die Logik in einem Windows-Dienst hosten, ist das Design plötzlich fehlerhaft.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage