В чем разница между процессом kill и процессом close?


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

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

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

5 52

5 ответов:

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

руководство довольно ясно, что:

Process.Close():

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

Process.Kill():

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

Process.CloseMainWindow:

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


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

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

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

Kill просит система бесцеремонно завершить процесс (через вызов Windows TerminateProcess системный вызов). Это сродни завершению процесса в Диспетчере задач.

закрыть закрывает дескриптор процесса в .NET, но фактически не касается самого процесса. Close называют Dispose. Смотрите ответ Джон Скит.

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

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

закрыть начинается закрытие объекта процесса. Это называется по утилизации. Рядом, как правило, используется для управления ресурсами объекта процесса.

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

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

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

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

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

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