【发布时间】:2014-09-16 21:23:26
【问题描述】:
我有一个 TopShelf (3.1.3) 服务,它在引发异常时处于“停止”状态。因此,不会调用任何服务恢复步骤,并且只有在通过“taskkill”手动终止服务时才能成功卸载服务。
在 TopShelf 中处理异常的推荐方法是什么?我不想简单地吞下/记录异常并继续。理想情况下,对 hostControl.Stop 的调用确实会将服务置于“停止”状态,但事实并非如此。
这个帖子问了一个类似的问题,但它没有提供答案: How to catch exception and stop Topshelf service?
想法?
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;
}
}
【问题讨论】:
-
服务没有成功停止,因为您在 Stop 方法中等待任务。删除该行并正确退出。
标签: c# error-handling windows-services topshelf