Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 22992|Odpowiedź: 2

[Źródło] Szczegółowe wyjaśnienie kilku sposobów rozwiązania problemu programu w C#, który pozwala uruchomić tylko jedną instancję

[Skopiuj link]
Opublikowano 08.12.2016 13:11:13 | | |

Metoda 1:
Użyj zmiennych mutex w wątkach. Zdefiniuj zmienne mutex, aby określić, czy dana instancja działa.
Zmień funkcję Main() w pliku program.cs na następujący kod:




Uwaga: W programie polecenie System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone); Aby utworzyć zmienną mutex, przebiegnij tak, gdzie "single_test" to nazwa mutex, a gdy ta metoda zwraca się, jeśli zostanie utworzony lokalny mutex lub określony system nazewnictwa mutex, wartość boole'a runone jest prawdziwa; nieprawda, jeśli określony system nazewnictwa mutex już istnieje. Nazwane mutexy działają na poziomie całego systemu.
Metoda 2: Użyj metody oceny procesu, zanim uruchomimy program, sprawdzamy, czy w procesie jest proces o tej samej nazwie, a pozycja działająca jest również tym samym procesem. Aby ją zaimplementować, zastosuj klasę Process w przestrzeni nazw System.Diagnostics w C#, główny kod wygląda następująco:
1. Dodaj funkcję do pliku program.cs w następujący sposób:




2. Zmień funkcję główną () na następujący kod:




Metoda 3: Globalna metoda atomowa, przed utworzeniem programu najpierw sprawdź globalną tabelę atomową, czy istnieje konkretny atom A (dodany w momencie tworzenia), i zatrzymaj jego tworzenie, gdy istnieje, wskazując, że program uruchomił instancję; Jeśli nie istnieje, uruchom program i chcesz dodać konkretny atom A do globalnej tabeli atomowej; Po wyjściu z programu pamiętaj, aby zwolnić konkretny atom A, w przeciwnym razie nie zostanie on zwolniony, dopóki komputer nie zostanie wyłączony. Implementacja w C# wygląda następująco:
1. Zadeklaruj interfejs funkcji WinAPI

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalAddAtom(String lpString); Dodaj atomy
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalFindAtom(String lpString); Znajdź atomy
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
publiczny statyczny zewnętrzny UInt32 GlobalDeleteAtom(UInt32 nAtom); Usuń atomy
2. Zmodyfikuj funkcję Main() w następujący sposób:




3. Dodaj następujący kod do zdarzenia FormClosed:
GlobalDeleteAtom(GlobalFindAtom("jiaao_test")); Usuń atomowe "jiaao_test"
--------------------------------------*-------*--------*-----------------------------------------------
Powyższe to podstawowa idea tworzenia programu wykluczającego się wzajemnie i osobiście uważam, że pierwsza metoda jest najprostsza.




Poprzedni:Różnica między Directory.GetCurrentDirectory a Application.StartupPath
Następny:Różnica między profilami klienta .Net Framework4 a .Net Framework4.0
Opublikowano 10.07.2017 06:31:21 |
Dziękuję za podzielenie się
 Ziemianin| Opublikowano 23.07.2024 14:21:04 |
Programy w C# pozwalają tylko jednej instancji uruchomić poprawny kod
https://www.itsvse.com/thread-3391-1-1.html
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com