Моя прикладная задача не может быть уничтожена с помощью cmd

#c# #windows #taskkill

#c# #Windows #завершение выполнения задачи

Вопрос:

Моя прикладная задача C # и WPF не может быть удалена диспетчером задач или консолью. Это очень большое приложение, но нет ничего нового, что могло бы сделать задачу «пуленепробиваемой»

Я пытался:

 wmic process where name="MyApp.exe" call terminate
  

Но там написано: возвращайте значение 2, и это не останавливает процесс.

С помощью

 Taskkill /IM MyApp.exe /T /F
  

Она возвращает «Доступ запрещен», даже когда я запускаю ее от имени администратора.

Я действительно не знаю, что происходит и почему Windows не может закрыть задачу моего приложения. Если я перезагружу компьютер, задача завершится.

Комментарии:

1. Возможно, ваше приложение уже мертво (-ish) и все еще висит без дела, потому что Windows занята сбросом памяти после необработанного исключения, или на него по-прежнему ссылаются другие приложения — другими словами, у вас зомби. Вы можете использовать что-то вроде Process Explorer (даже немного более сложное, чем диспетчер задач), чтобы проверить, так ли это. Единственный способ избавиться от процесса-зомби (кроме перезапуска) — это определить, откуда поступают к нему открытые дескрипторы, и закрыть их (например, завершив эти приложения).

2. Другой, более пагубной причиной процессов-зомби является процесс, который застревает в процессе ввода-вывода, потому что процесс не может завершиться, пока все ожидающие ввода-вывода не будут завершены или отменены. Обычно это происходит только с плохими драйверами устройств, но если это происходит, перезапуск является практически единственным решением — профилактика — это единственное лекарство.

3. @JeroenMostert спасибо, как вы думаете, возможно ли обнаружить завершение задачи из моего приложения и, таким образом, закрыть его изнутри?

4. Если ваш процесс действительно является зомби, он больше не должен запускать код в первую очередь (просто висит как заглушка), и поэтому он не должен быть способен делать что-либо в этом роде. Такие вещи, как дампы памяти, приостанавливают процесс, снова делая его неспособным запускать какой-либо код. Если каким-то образом ваш процесс все еще выполняется, он может завершить себя с помощью Environment.FailFast , но вы не могли бы этого сделать с помощью taskkill — что касается этого, конец уже есть. Любая передача сигналов должна выполняться с помощью механизмов, которые предоставляет само ваше приложение, и они не должны работать, если оно уничтожается.

5. Самый верный способ остановить процесс — это вызвать TerminateProcess() его, но я почти уверен, что это именно то, что taskkill /f в конечном итоге делается в любом случае. Теоретически это не должно позволять приложению работать бесконечно — весь смысл TerminateProcess в том, что вы не можете уклониться или обойти это.