【发布时间】:2016-09-24 17:09:17
【问题描述】:
我有一个 TopShelf 服务,它使用异步代码连接到 Web 服务和其他应用程序服务器。
如果它无法在启动时初始化其连接,服务应该记录一些错误并正常停止。
我查看了this question 关于在不满足开始条件时停止 TopShelf 的信息。 This answer 谈到使用 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,因为我必须从async 方法返回Task<bool>。
我目前允许从 Start() 函数冒泡异常,以便 TopShelf 可以看到它们并在异常冒泡时自动停止服务。但是,我的代码完全未处理异常,因此我在写入的各种日志中都会收到令人讨厌的未处理异常错误消息。我更愿意用一个不错的错误消息和干净的服务关闭来替换它。
所以,我有两个问题:
- 对 TopShelf 使用
async void Start()方法有什么问题吗? - 如果我的服务运行
async代码,有没有办法让Init()抛出异常,异常详细信息被正常记录,然后服务停止?
【问题讨论】:
标签: c# asynchronous async-await topshelf