我有一个 TopShelf (3.1.3) 服务,它在引发异常时处于“停止”状态。因此,不会调用任何服务恢复步骤,并且只有在通过“taskkill”手动终止服务时才能成功卸载服务。
在 TopShelf 中处理异常的推荐方法是什么?我不想简单地吞下/记录异常并继续。理想情况下,对 hostControl.Stop 的调用确实会将服务置于“停止”状态,但事实并非如此。
该线程提出了一个类似的问题,但它没有提供答案: 如何捕获异常并停止 Topshelf 服务?
想法?
HostFactory.Run(o =>
{
o.UseNLog();
o.Service<TaskRunner>();
o.RunAsLocalSystem();
o.SetServiceName("MyService");
o.SetDisplayName("MyService");
o.SetDescription("MyService");
o.EnableServiceRecovery(r => r.RunProgram(1, "notepad.exe"));
});
public class TaskRunner : ServiceControl
{
private CancellationTokenSource cancellationTokenSource;
private Task mainTask;
public bool Start(HostControl hostControl)
{
var cancellationToken = cancellationTokenSource.Token;
this.mainTask = Task.Factory.StartNew(() =>
{
try
{
while (!this.cancellationTokenSource.IsCancellationRequested)
{
// ... service logic ...
throw new Exception("oops!");
}
}
catch (Exception)
{
hostControl.Stop();
}
});
return true;
}
public bool Stop(HostControl control)
{
this.cancellationTokenSource.Cancel();
this.mainTask.Wait();
return true;
}
}