簡體   English   中英

C#NET應用程序未關閉Java進程

[英]C# NET Application not shutting down Java Process

我編寫了一個C#NET應用程序(作為服務運行的控制台應用程序),該應用程序管理Java進程(Minecraft Game Server),而我們的Web Panel軟件則管理我的應用程序。 當Java進程停止時,我的應用程序會自行停止,而當我的應用程序停止時,它將停止Java進程。

我遇到的問題是,經過廣泛的錯誤測試后,我將軟件部署到了所有機器上,但是似乎遺漏了一個錯誤,該錯誤有時無法關閉Java進程。 當Web軟件嘗試啟動我的應用程序,我的應用程序嘗試啟動Java進程時,此錯誤很可怕,但是由於無法綁定IP(由於舊進程保持打開狀態)而失敗,並且最終出現15-30個錯誤Java進程正在運行。

  • 我正在使用CurrentDomain_UnhandledException來捕獲應用程序的崩潰並調用TerminateProcess()。
  • 我正在使用CtrlTypes.CTRL_C_EVENTCtrlTypes.CTRL_CLOSE_EVENT檢測到我的應用程序已關閉,這也調用了TerminateProcess()函數。

我已經嘗試了以下兩種方法...

static void TerminateProcess()
{
    log.LogMessage("Minecraft Process Shutdown.");
    SendProcessCmd("stop");
}

    static void TerminateProcess()
    {
        log.LogMessage("Minecraft Process Shutdown.");
        minecraftProcess.Kill();
    }

但是,我似乎丟失了關閉C#應用程序的另一種方式,因為這兩種方式似乎都會使Java進程偶爾運行一次,而我無法在本地進行復制。

好吧,您沒有提出任何問題,我想您想問一下可以關閉進程的其他方式,以便您可以攔截它並確保Java進程終止。 簡而言之:這是不可能的(完全概括)。

只需看一下您自己的代碼:您正在執行與Minecraft完全相同的操作:調用TerminateProcess會使目標進程立即終止,而沒有任何機會進行清理。 如果有人在您身上調用TerminateProcess (例如,從任務管理器中殺死該進程的用戶),您的進程將立即終止。

另外,某些致命異常是無法捕獲的,例如,當您的進程死於堆棧溢出時 ,不會被告知,只是終止了。

我想您需要創建另一個進程,監視您的進程……(或者重新思考整個體系結構,創建和銷毀進程,尤其是使用TerminateProcess時,對我來說似乎有點困難。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM