что делать, если код выше возвращает исключение (32-битные процессы не могут получить доступ к модулям 64-битного процесса)?
Manish
40
Оставьте ".exe" выключенным. Из MSDN: «Имя процесса - это понятное имя для процесса, такого как Outlook, которое не включает расширение .exe или путь»
1
@AgainMe Process.Kill () отправляет сигнал уничтожения процессу, который останавливает его выполнение, где бы он ни находился. Это отличается от сигнала прерывания тем, что у процесса не будет возможности ответить и / или очистить сигнал. В этом процессе больше не будет выполняться, и любые блокировки ресурсов, используемых этим процессом, будут сняты. Environment.Exit () выполняется текущим выполняющимся процессом, чтобы убить себя с помощью кода успеха, что совершенно безопасно. Process.Kill () далеко не так безопасен, как Environment.Exit ().
jchitel
2
Я предлагаю использовать LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Есть ли возможность убить конкретный экземпляр процесса? Я имею в виду, Contains("Spotify"))убивает все экземпляры Spotify. Я хочу убить конкретный экземпляр Spotify.
var chromeDriverProcesses =Process.GetProcesses().Where(pr => pr.ProcessName=="chromedriver");// without '.exe'foreach(var process in chromeDriverProcesses){
process.Kill();}
Обновить:
Если вы хотите использовать asyncподход с некоторыми полезными недавними методами из C# 8( Async Enumerables ), проверьте это:
conststring processName ="chromedriver";// without '.exe'awaitProcess.GetProcesses().Where(pr => pr.ProcessName== processName).ToAsyncEnumerable().ForEachAsync(p => p.Kill());
Примечание: использование asyncметодов не всегда означает, что код будет работать быстрее, но, по крайней мере, это не будет тратить впустую время ЦП и предотвратит зависание потока переднего плана во время выполнения операций. В любом случае нужно подумать, какая версия вам может понадобиться.
Забавное совпадение, я искал в этой ветке решение для убийства хромодрайвера. Должно быть распространенная проблема.
kerl 09
Тоже самое. это, похоже, не решает эту проблему. Начальная консоль, которая запускается, на самом деле является экземпляром chrome.exe, и я предполагаю, что вы не хотите принудительно закрывать все из них, если это не агент сборки / тестирования
foreach(var process inProcess.GetProcessesByName("WINWORD")){// Temp is a document which you need to kill.if(process.MainWindowTitle.Contains("Temp"))
process.Kill();}
простой .Replace(".exe", "")ответ, получивший голосование сверху, сделает это с гораздо менее запутанным и ненужным кодом
AndrewK
Вся идея заключается в том, чтобы увидеть метод с .exe или без него, чтобы люди могли увидеть несколько способов его обработки ... Он не предназначен для копирования и вставки ....
Ответы:
Быстрый ответ:
(оставьте .exe в имени процесса)
источник
Contains("Spotify"))
убивает все экземплярыSpotify
. Я хочу убить конкретный экземплярSpotify
.Мое решение - использовать Process.GetProcess () для вывода списка всех процессов.
Отфильтровав их, чтобы они содержали нужные мне процессы, я могу запустить метод Process.Kill (), чтобы остановить их:
Обновить:
Если вы хотите использовать
async
подход с некоторыми полезными недавними методами изC# 8
( Async Enumerables ), проверьте это:источник
Вы можете использовать
Process.GetProcesses()
для получения текущих запущенных процессов, а затемProcess.Kill()
для уничтожения процесса.источник
Если у вас есть идентификатор процесса (
PID
), вы можете убить этот процесс следующим образом:источник
Вы можете убить определенный экземпляр MS Word.
источник
Резюме : независимо от того, содержит ли имя .exe, процесс завершится. Вам не нужно «убирать .exe из имени процесса», он работает на 100%.
источник
.Replace(".exe", "")
ответ, получивший голосование сверху, сделает это с гораздо менее запутанным и ненужным кодом