我在 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 任务可以就这样死掉吗?