Может кто-нибудь объяснить, почему этот блок 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");
}
}
}
}
выходы
starting
throwing
stopping
EDIT: Пожалуйста, прокомментируйте, почему вы понижаете рейтинг, возможно, вы не понимаете проблему? Я вижу здесь большую проблему. Вы пишете некоторую логику домена, которая делает важные вещи в предложении finally в Exception. Тогда, если вы используете логику в службе Windows, дизайн внезапно нарушается.