启动新实例时如何获取ID进程?
how to get ID process when it is started a new instance?
我正在尝试启动 Firefox 并在几秒钟后将其关闭。我的代码是这样的:
using (Process myProcess = new Process())
{
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe";
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
Task.Delay(5000);
Process.Start("taskkill.exe", $"/PID {myProcess.Id}");
}
然后问题是当我在taskkill进程中设置断点时,myProcess.Id在任务管理器中不存在。 Firefox 的所有实例都有另一个 ID。
如果我尝试打开记事本,它可以工作,记事本的 ID 是 myProcess 的 ID。
所以我在想,也许在 Firefox 中它打开了一个进程,它关闭了,然后又打开了另一个 Firefox 实例。这是真的吗?
怎么知道firefox的ID?或者我怎么能杀死 Firefox 的所有进程?因为其实我的Firefox进程不是只有一个,我有很多。
谢谢。
当使用 Task.Delay(...)
时,你应该 await
否则你 开始 一个新任务并 忘记 它没有任何延迟:
您修改的代码:
//TODO: check if your method is declared as async
private async Task MyMethod() {
...
using (Process myProcess = new Process()) {
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe";
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
// await for 5 seconds delay
await Task.Delay(5000);
// this will be continued after 5 seconds delay
// Do not forget to dispose yet another process - taskkill.exe
// Why not myProcess.Kill(); ?
using (Process.Start("taskkill.exe", $"/PID {myProcess.Id}")) {}
}
代码:(我的版本)
//TODO: check if your method is declared as async
private async Task MyMethod() {
...
// Let's extract model (how to start process) from execution
ProcessStartInfo psi = new ProcessStartInfo() {
UseShellExecute = false,
FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe",
CreateNoWindow = false,
};
// Process.Start can return null, which we forgive with !
using (Process myProcess = Process.Start(psi)!) {
// We, typically, cancel Tasks instead of delaying and analyzing
using (CancellationTokenSource cts = new CancellationTokenSource(5000)) {
try {
// start process with cancellation after 5 seconds
await myProcess!.WaitForExitAsync(cts.Token);
}
catch (TaskCanceledException) {
// if process has been cancelled (not completed) we want to kill it
myProcess!.Kill();
}
}
}
我正在尝试启动 Firefox 并在几秒钟后将其关闭。我的代码是这样的:
using (Process myProcess = new Process())
{
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe";
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
Task.Delay(5000);
Process.Start("taskkill.exe", $"/PID {myProcess.Id}");
}
然后问题是当我在taskkill进程中设置断点时,myProcess.Id在任务管理器中不存在。 Firefox 的所有实例都有另一个 ID。
如果我尝试打开记事本,它可以工作,记事本的 ID 是 myProcess 的 ID。
所以我在想,也许在 Firefox 中它打开了一个进程,它关闭了,然后又打开了另一个 Firefox 实例。这是真的吗?
怎么知道firefox的ID?或者我怎么能杀死 Firefox 的所有进程?因为其实我的Firefox进程不是只有一个,我有很多。
谢谢。
当使用 Task.Delay(...)
时,你应该 await
否则你 开始 一个新任务并 忘记 它没有任何延迟:
您修改的代码:
//TODO: check if your method is declared as async
private async Task MyMethod() {
...
using (Process myProcess = new Process()) {
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe";
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
// await for 5 seconds delay
await Task.Delay(5000);
// this will be continued after 5 seconds delay
// Do not forget to dispose yet another process - taskkill.exe
// Why not myProcess.Kill(); ?
using (Process.Start("taskkill.exe", $"/PID {myProcess.Id}")) {}
}
代码:(我的版本)
//TODO: check if your method is declared as async
private async Task MyMethod() {
...
// Let's extract model (how to start process) from execution
ProcessStartInfo psi = new ProcessStartInfo() {
UseShellExecute = false,
FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe",
CreateNoWindow = false,
};
// Process.Start can return null, which we forgive with !
using (Process myProcess = Process.Start(psi)!) {
// We, typically, cancel Tasks instead of delaying and analyzing
using (CancellationTokenSource cts = new CancellationTokenSource(5000)) {
try {
// start process with cancellation after 5 seconds
await myProcess!.WaitForExitAsync(cts.Token);
}
catch (TaskCanceledException) {
// if process has been cancelled (not completed) we want to kill it
myProcess!.Kill();
}
}
}