PROWAREtech








.NET: Kill or End a Process
How to terminate a process using C#.
Kill an existing process in .NET with a simple Process.Kill(). There is an optional parameter, true or false, to end all the child processes associated with the process being ended.
Learn how to create processes.
To end the current process:
System.Diagnostics.Process.GetCurrentProcess().Kill(true);
To end all processes with the name "notepad" on the current machine:
static void KillAllNotepadProcesses()
{
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("notepad", "."); // use "." for this machine
foreach (var proc in procs)
proc.Kill(true);
}
To end all processes with the name "notepad" on another machine:
static void KillAllNotepadProcesses()
{
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("notepad", "Machine-Name-or-IP-Address"); // enter the IP address or machine name
foreach (var proc in procs)
proc.Kill(true);
}
To end all the other instances of the current process:
static void KillAllOtherInstances()
{
System.Diagnostics.Process thisProc = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(thisProc.ProcessName, "."); // use "." for this machine
foreach (var proc in procs)
if (proc.Id != thisProc.Id) // the process Id is unique across all processes while the process name can be common
proc.Kill(true);
}
Complete Real World Example
To expand on the above snippets, the below code has been prepared. It uses brute force to solve π which is very taxing on the CPU. So what happens is it ends (kills) all other instances of itself to prevent over-taxing the machine. Compile this code and try to run more than one instance!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace KillOtherInstancesAndSolvePI
{
class JobTask
{
public Task task { get; }
public int id { get; }
public double pi { get; set; }
public ulong iterations { get; set; }
public CancellationTokenSource CancelToken { get; }
public JobTask(int id)
{
this.id = id;
CancelToken = new CancellationTokenSource();
task = Task.Run(async () => // async not necessary in this example
{
var spaces = Environment.ProcessorCount.ToString().Length;
iterations = (ulong)new Random().Next() * 10;
Console.WriteLine("Started Job: {0, -" + spaces + "} Iterations: {1}", id, iterations);
pi = SolvePi(iterations, CancelToken);
Console.WriteLine("Job: {0, -" + spaces + "} ended with pi={1}", id, pi.ToString("0.00000000000000"));
}, CancelToken.Token);
}
static double SolvePi(ulong count, CancellationTokenSource cancel)
{
//π = 3.14159265358979323846264338327950288419...
//π = (4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/15) + ...
//π = 4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + ...)
double x = 1.0;
for (ulong i = 2; !cancel.IsCancellationRequested & (i < count); i++)
{
if ((i & 1) == 0)
x -= 1.0 / ((i << 1) - 1);
else
x += 1.0 / ((i << 1) - 1);
}
return 4.0 * x;
}
}
class Program
{
static void KillAllOtherInstances()
{
System.Diagnostics.Process thisProc = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(thisProc.ProcessName, ".");
foreach (var proc in procs)
if (proc.Id != thisProc.Id)
proc.Kill(true);
}
static void Main(string[] args)
{
KillAllOtherInstances(); // end the other process before trying to solve PI
var jobTasks = new List<JobTask>();
Console.WriteLine("pi={0}", 3.1415926535897932384626433833.ToString("0.00000000000000"));
Console.WriteLine("Logical Processors: {0}", Environment.ProcessorCount);
Console.WriteLine("ENTER JOB NUMBER TO TERMINATE AT ANYTIME");
var spaces = Environment.ProcessorCount.ToString().Length;
int[] jobsIds = new int[Environment.ProcessorCount];
for (int i = 0; i < Environment.ProcessorCount; i++)
jobsIds[i] = i;
foreach(var jobId in jobsIds)
jobTasks.Add(new JobTask(jobId));
Thread.Sleep(250);
foreach (var j in jobTasks.OrderBy(j => j.iterations))
Console.WriteLine("Job: {0, -" + spaces + "} Iterations: {1}", j.id, j.iterations);
Task.Run(() => // create a task to terminate the app when all pi tasks are done
{
while (jobTasks.Where(j => j.task.IsCompleted == false).Count() > 0)
Thread.Sleep(250);
Environment.Exit(0);
});
while (jobTasks.Where(j => j.task.IsCompleted == false).Count() > 0) // look for a request to cancel a job from the user
{
var id = Console.ReadLine();
JobTask jt = jobTasks.Where(j => j.id.ToString() == id).FirstOrDefault();
if(jt != null)
jt.CancelToken.Cancel();
}
}
}
}
Comment