Как обрабатывать асинхронные ошибки 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 код?

Ответы на вопрос(1)

Ваш ответ на вопрос