MMazi Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 Hallo zusammen Ich habe in meiner Anwendung die ich geschrieben habe diese Code in App.Xaml.cs hinzugefügt um ihn nur einmal Starten lassen leider Erfolglos. habt Ihr eine andere Lösung o. was mache ich hier Falsch? Danke für die Antworten using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.Threading; using System.Windows; namespace TimeRecorderPro { /// <summary> /// Interaktionslogik für "App.xaml" /// </summary> /// public partial class App : Application { private Mutex mutex = null; //protected override void OnStartup(StartupEventArgs e) protected override void OnStartup(StartupEventArgs e) { bool createdNew; //Mutex mit eindeutigem Namen (bspw. GUID) mutex = new Mutex(true, "77aca664-ba25-4964-bc05-d7ba57030720", out createdNew); if(!mutex.WaitOne(TimeSpan.Zero, true)) //Prüfung, ob Mutex schon länger aktiv ist.. { //Mutex ist gerade gestartet.. base.OnStartup(e); } else { ////Mutex läuft bereits längere Zeit.. MessageBox.Show("Anwendung läuft bereits!"); ////Anwendung beenden Environment.Exit(0); } } } } Zitieren
KeeperOfCoffee Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 Darf man fragen, warum Timespan.Zero verwendet wird? Zitieren
KeeperOfCoffee Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 (bearbeitet) Auch: Welche .NET Version, was sagt die Ausgabe, wird ne Exception geworfen? Edit: ganz vergessen, dass ich schon was gepostet habe, sry Doppelpost. Habe mal das mit .NET 5 von dir kopiert und es wir kein Fehler so geworfen Bearbeitet 8. Dezember 2020 von KeeperOfCoffee Zitieren
Whiz-zarD Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 vor 1 Stunde schrieb KeeperOfCoffee: Habe mal das mit .NET 5 von dir kopiert und es wir kein Fehler so geworfen Kann ich nicht nachvollziehen. Bei mir geht er immer in den else-Zweig. Für mich macht der Code auch überhaupt keinen Sinn, der WaitHandle, der mit WaitOne() aufgerufen wird, wartet auf ein Signal, was aber nie kommen wird, da nie ein Signal geschickt wird. Es reicht, wenn man einfach createdNew abfragt. public partial class App : Application { private Mutex mutex; protected override void OnStartup(StartupEventArgs e) { mutex = new Mutex(true, "MyMutex", out bool createdNew); if(!createdNew) { MessageBox.Show("Anwendung läuft bereits!"); Environment.Exit(0); } base.OnStartup(e); } } Zitieren
KeeperOfCoffee Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 (bearbeitet) Ich habe ja schon lange nichts mehr mit Mutex gemacht, aber muss dieser nicht disposed, geschlossen, released whatever werden, damit eine https://docs.microsoft.com/de-de/dotnet/api/system.threading.abandonedmutexexception?view=net-5.0 nicht verursacht wird? Oder passiert das einfach, wenn das Programm wieder geschlossen wird? Zitat Kann ich nicht nachvollziehen. Bei mir geht er immer in den else-Zweig. Ich habs nur auf .NET Fiddle getestet mit ner Consolenanwendung. Kann nicht für jede Sache im Forum ein Wegwerfprojekt starten. Hat bei .NET 4.8 gemeckert, bei .NET 5 nicht. Deswegen habe ich ja gefragt, was der TimeSpan.Zero soll und ob es ne Exception gibt. Der TE schreibt ja fast keine Infos. Bearbeitet 8. Dezember 2020 von KeeperOfCoffee Zitieren
Whiz-zarD Geschrieben 8. Dezember 2020 Geschrieben 8. Dezember 2020 Sieht so aus, dass er automatisch geschlossen wird, wenn kein Prozess mehr ein Handle drauf hat. Zitieren
MMazi Geschrieben 14. Dezember 2020 Autor Geschrieben 14. Dezember 2020 Sorry , ja stimmt hab wenig infos geschrieben, Whiz-zard hast du recht der Programmhatte Automatisch geschlossen letztendlich habe andere Lösung dafür genommen. Danke für die Antworten Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.