Как обрабатывать асинхронные ошибки Start () в TopShelf
У меня есть служба TopShelf, которая использует асинхронный код для подключения к веб-службам и другим серверам приложений.
Если он не может инициализировать свои соединения при запуске, служба должна регистрировать некоторые ошибки и корректно останавливаться.
Я посмотрел наэтот вопрос об остановке TopShelf, когда начальные условия не выполнены.Этот ответ говорит об использовании TopShelf HostControl для остановки службы.
Тем не менее, этот ответ опирается наServiceConfigurator<T>.WhenStarted<T>(Func<T, HostControl, bool> start)
метод.
В настоящее время я настраиваю сервис TopShelf стандартным способом:
x.Service<MyService>(s =>
{
s.ConstructUsing(() => new MyService());
s.WhenStarted(s => s.Start());
s.WhenStopped(s => s.Stop());
});
Однако мой сервисStart()
метод на самом делеasync
определяется так:
public async void Start()
{
await Init();
while (!_canceller.Token.IsCancellationRequested)
{
await Poll();
}
}
Кажется, это работает нормально. Но я использую ключевое слово await в нескольких местах функции. Так что я не могу просто изменить свойStart()
метод взятьHostControl
и вернутьbool
потому что я должен был бы вернутьсяTask<bool>
изasync
метод.
В настоящее время я разрешаю всплыть исключениям из функции Start (), чтобы TopShelf мог их видеть и автоматически останавливать службу, когда всплывают исключения. Однако в моем коде исключения полностью не обрабатываются, и поэтому я получаю неприятные необработанные сообщения об ошибках исключений в различных журналах, в которые я пишу. Который я бы предпочел заменить на хорошее сообщение об ошибке и чистое отключение службы.
Итак, у меня есть два вопроса:
Есть ли проблемы с использованиемasync void Start()
метод для TopShelf?Есть ли способ сделать так, чтобы еслиInit()
генерирует исключение, подробности исключения регистрируются, и затем служба останавливается, учитывая, что моя служба работаетasync
код?