Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 22992|Antwoord: 2

[Bron] Gedetailleerde uitleg van verschillende manieren om het probleem van een C#-programma op te lossen dat slechts één instantie toestaat te draaien

[Link kopiëren]
Geplaatst op 08-12-2016 13:11:13 | | |

Methode 1:
Gebruik thread-mutexvariabelen. Definieer mutexvariabelen om te bepalen of een instantie draait.
Verander de Main()-functie in het program.cs-bestand naar de volgende code:




Opmerking: In het programma wordt de instructie System.Threading.Mutex uitgevoerd = nieuwe System.Threading.Mutex (true, "single_test", out runone); om een mutexvariabele te maken, voer uit, waarbij "single_test" de mutexnaam is, en wanneer deze methode terugkeert, als een lokale mutex of een gespecificeerd naamgevingssysteem wordt aangemaakt, is de booleaanse waarde runone waar; onwaar als het gespecificeerde naamgevingssysteem al bestaat. Benoemde mutexen zijn systeembreed.
Methode 2: Gebruik de methode om het proces te beoordelen, voordat we het programma uitvoeren, kijken we of er een proces met dezelfde naam in het proces zit, en dat de looppositie ook hetzelfde proces is. Pas de Process-klasse toe in de naamruimte System.Diagnostics in C# om deze te implementeren, de hoofdcode is als volgt:
1. Voeg een functie toe aan het program.cs bestand als volgt:




2. Verander de Main () functie naar de volgende code:




Methode 3: Globale atomaire methode, voordat je een programma maakt, controleer eerst de globale atomaire tabel om te zien of er een specifiek atoom A is (toegevoegd bij het maken van het programma), en stop het aanmaken wanneer het bestaat, wat aangeeft dat het programma een instantie heeft uitgevoerd; Als het niet bestaat, start dan het programma en wil je een specifiek atoom A toevoegen aan de globale atoomtabel; Vergeet bij het afsluiten van het programma een specifiek atoom A vrij te laten, anders wordt het pas vrijgegeven als de computer is uitgeschakeld. De C#-implementatie is als volgt:
1. Declareer de WinAPI-functieinterface

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
publieke statische externe UInt32 GlobalAddAtom(String lpString); Voeg atomen toe
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
publieke statische externe UInt32 GlobalFindAtom(String lpString); Vind atomen
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
publieke statische externe UInt32 GlobalDeleteAtom(UInt32 nAtom); Verwijder atomen
2. Pas de Main()-functie als volgt aan:




3. Voeg de volgende code toe aan het FormClosed-evenement:
GlobalDeleteAtom(GlobalFindAtom("jiaao_test")); Verwijder atomaire "jiaao_test"
--------------------------------------*-------*--------*-----------------------------------------------
Bovenstaande is het basisidee van het creëren van een wederzijds exclusief programma, en ik denk persoonlijk dat de eerste methode de eenvoudigste is.




Vorig:Verschil tussen Directory.GetCurrentDirectory en Application.StartupPath
Volgend:Het verschil tussen het clientprofiel van .Net Framework4 en .Net Framework4.0
Geplaatst op 10-07-2017 06:31:21 |
Bedankt voor het delen
 Huisbaas| Geplaatst op 23-07-2024 14:21:04 |
C#-programma's staan slechts één instantie toe om de juiste code uit te voeren
https://www.itsvse.com/thread-3391-1-1.html
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com