.net - Hvordan stoppe processen i C #, kende dens filnavn?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et program, der kører en anden (lad os ringe til den første app Stater og den anden app - Worker).


Jeg bruger


process.start();
process.waiForExit();
process.Close();


i Starter.


Men hvis Starter er nødt til at lukke, mens han venter på Worker (af en eller anden ekstern årsag), vil arbejderen stadig være i processer, blokere filer, spise hukommelse osv.


Så jeg vil gerne kontrollere, om Arbejderen allerede kører, før jeg vil forsøge at starte den.
Jeg har prøvet Process.GetProcessesByName ('worker.exe') men ikke held og lykke (selvom jeg kan se Worker i Task Manager).


Jeg har set nogle emner her om at kontrollere hver proces i hukommelse for sine moduler, men jeg kender allerede kørerfilen, jeg håber at undgå en sådan løsning.


Eventuelle råd?

Bedste reference


Når du starter Worker-processen, skal du gemme dens ID i din applikations konfigurations-/indstillingsfil. På denne måde, når du starter din startproces, vil den først indlæse det id fra indstillingsfilen og kontrollere, om denne proces kører eller ej. Hvis du vil lukke arbejdsprocessen straks, kan du ringe process.Kill() på den.

Andre referencer 1


Grunden til at du ikke kan finde den, er fordi du bruger .exe. Hvis den eksekverbare vises som worker.exe i TaskManager, skal du bare ringe til:


Process[] workers = Process.GetProcessesByName("worker")
foreach (Process worker in workers)
{
     worker.Kill();
     worker.WaitForExit();
     worker.Dispose();
}

Andre referencer 2


Dette er meget lettere ...


System.Diagnostics.Process.Start("cmd.exe","/c taskkill /IM notepad.exe");


Denne kode lukker Notesblok (hvis den kører). Indtast det programnavn, du vil lukke med det \ n '


Nogle programmer kan ikke stoppes uden at tvinge.
Brug /F efter taskkill for at tvinge handlingen.
Hvis du vil lukke processtrømmen, brug /T efter programnavn.


System.Diagnostics.Process.Start("cmd.exe","/c taskkill /F /IM notepad.exe /T");

Andre referencer 3


Når du ringer til GetProcessesByName ('worker') , angiver du ikke exe-udvidelse som forklaret i MSDN

Og hvis du ønsker at holde en global variabel med det procesobjekt, du har startet, kan du blot bruge proces.Kill (); [9]

Andre referencer 4


Hvis du kun skal opdage , at 'arbejdstager' kører, er en teknisk meget overlegen løsning, at den låser en global mutex for hele levetiden. Enhver proces, der kender mutexnavnet (som er under din kontrol) kan derefter se om mutex er låst (hvis det er, arbejder medarbejderen).


Men det er ikke let at gennemføre korrekt, da der er mange små detaljer, du vil få lige ret; selv da kan der være en løbstilstand for 'starter' og 'arbejdstager' faktisk startes samtidig osv. (selvfølgelig er dette problem og mange andre også gældende for alle andre løsninger, så det kan ikke betragtes som en ulempe).