Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 22992|Răspunde: 2

[Sursă] Explicație detaliată a mai multor moduri de a rezolva problema unui program C# care permite rularea unei singure instanțe

[Copiază linkul]
Postat pe 08.12.2016 13:11:13 | | |

Metoda 1:
Folosește variabile mutex din fir. Definește variabilele mutex pentru a determina dacă o instanță rulează.
Schimbă funcția Main() din fișierul program.cs cu următorul cod:




Notă: În program, instrucțiunea System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone); pentru a crea o variabilă mutex, run, unde "single_test" este numele mutex, iar când această metodă revine, dacă se creează un mutex local sau un sistem de denumire specificat mutex, valoarea booleană runone este adevărată; fals dacă sistemul de denumire specificat, mutexe, există deja. Mutex-urile denumite sunt la nivelul întregului sistem.
Metoda 2: Folosiți modul de judecată a procesului, înainte să rulăm programul, găsim dacă există un proces cu același nume în proces, iar poziția de rulare este tot același proces. Aplică clasa Process în spațiul de nume System.Diagnostics în C# pentru a o implementa, codul principal este următorul:
1. Adaugă o funcție în fișierul program.cs după cum urmează:




2. Schimbă funcția principală () cu următorul cod:




Metoda 3: Metoda atomică globală, înainte de a crea un program, verifică mai întâi tabelul atomic global pentru a vedea dacă există un atom A specific (adăugat la momentul creării) și oprește crearea acestuia când există, indicând că programul a rulat o instanță; Dacă nu există, rulează programul și vrei să adaugi un atom A specific la tabelul atomic global; Când ieși din program, amintește-ți să eliberezi un atom A specific, altfel acesta nu va fi eliberat până când calculatorul nu este oprit. Implementarea C# este următoarea:
1. Declararea interfeței funcției WinAPI

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
extern static public UInt32 GlobalAddAtom(String lpString); Adaugă atomi
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
extern static public UInt32 GlobalFindAtom(String lpString); Găsește atomi
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
extern static public UInt32 GlobalDeleteAtom(UInt32 nAtom); Șterge atomii
2. Modifică funcția Main() astfel:




3. Adaugă următorul cod la evenimentul FormCloseded:
GlobalDeleteAtom(GlobalFindAtom("jiaao_test")); Șterge "jiaao_test" atomică
--------------------------------------*-------*--------*-----------------------------------------------
Cea de mai sus este ideea generală de bază a creării unui program mutual exclusiv și, personal, cred că prima metodă este cea mai simplă.




Precedent:Diferența dintre Directory.GetCurrentDirectory și Application.StartupPath
Următor:Diferența dintre profilul clientului .Net Framework4 și .Net Framework4.0
Postat pe 10.07.2017 06:31:21 |
Mulțumesc că ai împărtășit
 Proprietarul| Postat pe 23.07.2024 14:21:04 |
Programele C# permit doar o singură instanță să ruleze codul corect
https://www.itsvse.com/thread-3391-1-1.html
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com