我在Windows服务中有一项任务。继承人感兴趣的代码:
private Task Schedule(Action action, int interval, EventDefinition restoreEvent = null) {
return new Task(() => {
bool error = false;
while (IsEnabled && !CTS.Token.IsCancellationRequested) {
if (!IsPaused) {
try { // we don't want our service to crash if anything goes wrong on production
action();
if (error && restoreEvent != null) SysEvent(restoreEvent);
error = false;
}
catch (Exception x) {
error = true;
SysEvent(new EventDefinition { Id = x.HResult, Message = x.Message, Type = EventLogEntryType.Error });
}
}
CTS.Token.WaitHandle.WaitOne(interval);
}
}, CTS.Token, TaskCreationOptions.LongRunning);
}
正如您所看到的 - 我的服务任务在循环,无限循环中运行,循环可能仅在IsEnabled设置为false时结束,并且仅在2点设置:服务启动和服务停止代码。它也可以在请求任务取消时结束,但这会停止服务。
但我的服务正在运行!它没有收到任何停止或取消请求。没有异常可以在while循环中破坏任务。但是大约30个小时后 - 服务就停止了,没有任何理由去做它的工作。它的状态仍然在运行。在任何系统日志中都没有单一错误或警告!它只是默默地死去。
发生了什么事?有线索吗? .NET任务会像这样死吗?