Приложение C # NET не закрывает Java-процесс - PullRequest
0 голосов
/ 02 августа 2011

Я написал приложение C # NET (консольное приложение, которое запускается как служба), которое управляет процессом Java (игровой сервер Minecraft), а наше приложение Web Panel управляет моим приложением.Когда процесс Java останавливается, мое приложение останавливается, а когда мое приложение останавливается, оно останавливает процесс Java.

Проблема, с которой я сталкиваюсь, заключается в том, что я развернул программное обеспечение на всех наших машинах после обширного тестирования на наличие ошибок., но, кажется, есть ошибка, которую мы пропустили, когда это НЕ останавливало процесс Java иногда.Эта ошибка ужасна, так как веб-программа пытается запустить мое приложение, мое приложение пытается запустить процесс Java, но происходит сбой из-за невозможности привязки IP (поскольку старый процесс остается открытым), и мы получаем 15-30 ошибокЗапущенные процессы Java.

  • Я использую CurrentDomain_UnhandledException , чтобы перехватить сбои моего приложения и вызвать TerminateProcess ().
  • Я использую CtrlTypes.CTRL_C_EVENT и CtrlTypes.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,Я не могу воспроизвести локально.

1 Ответ

1 голос
/ 02 августа 2011

Ну, вы не задали ни одного вопроса, я думаю, вы хотели спросить о других способах остановки процесса, чтобы вы могли перехватить его и обеспечить завершение процесса Java.Проще говоря: это невозможно (в полной общности).

Просто посмотрите на свой собственный код: вы делаете то же самое с Minecraft: вызов TerminateProcess приводит к немедленному завершению целевого процесса, без возможности очисткивверх.Если кто-нибудь позвонит вам TerminateProcess (например, пользователь, убивший процесс из диспетчера задач), ваш процесс просто немедленно прекратит работу.

Кроме того, некоторые фатальные исключения невозможно отследить, например, когда ваш процесс умирает на переполнение стека , вам не сказали, просто прервали.

Я думаю, вам нужно создать другой процесс, следящий за вашим процессом ... (Или переосмыслитьвся архитектура, процессы создания и уничтожения, особенно с TerminateProcess, кажутся мне немного грубыми.)

...