[英]Prevent windows server from suspending my process
取决于您的硬件/软件配置,很难知道您的瓶颈在哪里。
我建议改为使用多线程/任务应用程序,您可以在其中控制线程并分配优先级、资源、停止、恢复、中止等......
在命令控制台上使用启动并检查是否发生相同但参数高:
start /HIGH <ProgramPath>
windows 服务器上的任务计划程序 MSDN -> 优先级
(这只是一个意见,开始挖掘其他解决方案。)
在服务启动之前,您必须在服务的构造函数中将ServiceBase.CanPauseAndContinue
属性设置为False
。
注意副作用是:
如果 CanPauseAndContinue 为 false,则 SCM 不会将 Pause 或 Continue 请求传递给服务,因此即使实现了 OnPause 和 OnContinue 方法也不会被调用。 在 SCM 中,当 CanPauseAndContinue 为 false 时,Pause 和 Continue 控件被禁用。
有关详细信息,请参阅此Microsoft Doc
有多种方法可以让应用保持唤醒状态。
一种方法是请求延期,然后仅在完成后标记延期完成。
首先,您需要延迟 object 将保留在您的流程的 scope 中
SuspendingDeferral deferral
然后你需要覆盖OnSuspending
async protected void OnSuspending(object sender, SuspendingEventArgs args)
{
deferral = args.SuspendingOperation.GetDeferral();
await SuspensionManager.SaveAsync();
}
然后,当您的流程完成时,您需要将延迟标记为完成
if (deferral is not null) { deferral.Complete(); }
完整的详细信息可以在Microsoft 文档中找到
有关其他方法的讨论,请参阅此线程: 如何禁用 UWP 应用程序暂停?
从技术上讲,该过程已暂停,但如果您查看 32K 的 memory 消耗,您可以看出它没有暂停。 您的进程确实因未处理的异常而崩溃,这又会触发 Windows 错误报告以进行 memory 转储。
这涉及一些 kernel 魔术,它使 kernel(系统进程)中的进程句柄保持活动状态。 这不是什么大问题或 memory 泄漏,因为该过程已经终止。 只有PEB(进程环境块)32K,主要包括命令行,加载的dll和环境变量仍然存在。
我不会担心挂起的进程,但为什么您的进程会因未处理的异常而崩溃。 这甚至可以是一个功能,让程序员通过查看任务管理器中挂起的进程的冗长列表来意识到他们的进程确实崩溃了;-)。
由于它是一个 .NET 应用程序,您会在应用程序事件日志中找到一个进程确实崩溃的一般错误消息,以及一个 .NET 运行时记录的错误消息,其中包含更多异常详细信息。
也许这已经足以让你继续解决你的问题。 如果不是,您可以配置 WER 以通过注册表设置 ( https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps ) 创建完整的 memory 转储。 现在,您为每个“暂停”进程提供了一个完整的 memory 转储,您可以将其加载到 Visual Studio 中以进一步查看问题所在。
要进一步检查谁持有您的进程句柄仍处于打开状态,您可以使用句柄,例如 ProcessHacker(更好的 Process Explorer) https://processhacker.sourceforge.io/nightly.php
如果发生了其他事情,您可以使用此工具查看谁持有您的进程的任何未完成句柄打开。 但我强烈怀疑它是 Windows Kernel。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.