[英]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.