У меня есть служба 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
?