Finalmente não é executado quando em um thread em execução em um serviço do Windows
Alguém pode explicar por que esse bloco finalmente não é executado? Eu li posts sobre quando esperar que finalmente o bloco não seja executado, mas esse parece ser outro caso. Esse código precisa do TopShelf e do log4net. Estou executando o .net 4.5
Eu acho que deve ser o mecanismo do Windows Service que aciona exceções não tratadas, mas por que ele está sendo executado antes que o bloco finalmente tenha terminado?
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");
}
}
}
}
saídas
starting
throwing
stopping
Edição: por favor, comente porque você está fazendo o downgrade, talvez você não entenda o problema? Eu vejo um grande problema aqui. Você escreve alguma lógica de domínio que faz coisas importantes na cláusula finalmente em Exceção. Se você hospedar a lógica em um serviço do Windows, o design será interrompido repentinamente.