Подтвердить что ты не робот

Каковы различия между процессом убийства и закрытым процессом?

Когда я запускаю процесс и хочу закрыть этот процесс, каковы различия между Process.Close() и Process.Kill()?

Я спросил, потому что у меня есть приложение, которое начинает захватывать пакет с помощью Wireshark с помощью команды через командную строку с Windows = hidden. поэтому, когда я хочу остановить захват, я убью этот процесс. Иногда иногда захват открывается с ошибкой, что последний пакет был разрезан посередине, поэтому мне интересно, может ли использовать close() до того, как kill() решит эту проблему?

Когда я начинаю захватывать, я могу закрыть его, нажав Ctrl + C, но в моем случае я открою окно в скрытом состоянии. Могу ли я сделать что-то подобное с помощью моего кода?

4b9b3361

Ответ 1

В чем разница между Process.Close() и process.Kill()?

В руководстве достаточно ясно:

Process.Close():

Метод Close заставляет процесс прекратить ждать выхода, если он ожидает, закрывает дескриптор процесса и очищает свойства, зависящие от процесса. Close не закрывает стандартные выходные, входные и считывающие устройства ошибок и писателей в случае, если они ссылаются снаружи. [Т.е. сам процесс продолжает работать, вы просто не можете его контролировать, используя свой экземпляр Process

process.Kill():

Убивает принудительное завершение процесса, а CloseMainWindow запрашивает только завершение. [...] Запрос на выход из процесса, вызвав CloseMainWindow, не заставляет приложение завершить работу. Приложение может запросить проверку пользователя перед выходом из системы или может отказаться отказаться. Чтобы заставить приложение выйти, используйте метод Kill. Поведение CloseMainWindow идентично поведению пользователя, закрывающего основное окно приложения с помощью системного меню. Поэтому запрос на выход из процесса, закрывая главное окно, не заставляет приложение немедленно прекратить работу.

Process.CloseMainWindow:

Закрывает процесс, который имеет пользовательский интерфейс, отправив сообщение тега в главное окно.


Что касается вашего редактирования:

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

Используйте API WinPcap или библиотеку Pcap.Net для этого, а не Wireshark.

Ответ 2

Kill запрашивает систему для бесцеремонного завершения процесса (посредством вызова системы Close закрывает дескриптор процесса в .NET, но фактически не затрагивает сам процесс. Close также называется Dispose. См. этот ответ от Jon Skeet.

Третий вариант CloseMainWindow, который изящно закрывает программу, прося закрыть основное окно. Это похоже на щелчок правой кнопкой мыши по программе на панели задач и выбор Close.

Ответ 3

Убить и закрыть не два варианта. Убить (или CloseMainWindow) необходимо вызвать, если вы хотите завершить процесс. Вызов Close просто освободит ресурсы, но он не будет закрывать стандартные потоки. Закрытие потоков самостоятельно может или не может привести к завершению процесса, это зависит от процесса. Лучшей стратегией является вызов Kill или CloseMainWindow в зависимости от типа процесса, а затем Dispose объекта Process.

Close начинает закрывать объект Process. Он вызван Dispose. Close обычно используется для управления ресурсами объекта Process.

Kill завершает процесс. Это единственный способ завершить процесс, у которого нет пользовательского интерфейса.

CloseMainWindow отправляет закрытое сообщение в главное окно процесса. Это изящный способ остановить процесс с пользовательским интерфейсом.

Ответ 4

Process.Kill вызывает TerminateProcess.

Process.Close не делает то, что вы думаете, что он делает! Он просто освобождает ресурсы, используемые экземпляром класса. Пожалуйста, прочтите следующее: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.close.aspx

Ответ 5

Позвольте мне проиллюстрировать, что происходит визуально, когда вы вызываете Закрыть() и Kill(). Далее откроется Блокнот, но он не выйдет из блокнота в конце, когда выполняется myProcess.Close().

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Close();

откроется Блокнот. через 10 секунд блокнот закроется в конце, когда myProcess.Kill() выполнит.

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Kill();