Meilleure façon d’implémenter singleton dans une application console C #?

J’ai une application console basée sur le serveur. Je veux seulement 1 instance en cours d’exécution à la fois pour un serveur particulier (indépendamment de l’utilisateur qui peut l’exécuter).

Je dois append une vérification pour m’assurer qu’une seule instance est en cours d’exécution. Je peux déjà le faire en vérifiant les processus en cours sur le serveur, mais s’agit-il d’une meilleure pratique?

Étant donné que je cherche constamment à améliorer les styles de codage et à restr à jour, existe-t-il une meilleure façon de le faire récemment? Si vous pensez: “Si ce n’est pas cassé, ne le corrigez pas”, vous avez peut-être raison, mais je veux tirer davantage parti des fonctionnalités intégrées du framework.

J’utilise .net v3.5, et ceci est une application console.

Merci d’avance

Vous devez utiliser la classe Mutex, comme expliqué ici: Application C # .NET Single Instance

Quelle est la bonne façon de créer une application à instance unique a certains moyens de le faire, y compris l’article mentionné ci-dessus

J’ai eu besoin d’assembler des morceaux de code de partout, mais j’ai finalement trouvé la sauce magique qui crée conceptuellement une application pour console singleton qui peut également continuer à recevoir des arguments en ligne de commande. Ainsi, la première fois que cela est exécuté, il traite ses parameters de ligne de commande, puis attend. Lorsque vous essayez de l’exécuter à nouveau, si le premier est toujours en cours d’exécution, ces arguments de ligne de commande sont passés au premier processus pour traitement, et le second processus meurt.

using System; using System.IO; using System.IO.Pipes; using System.Threading; using System.Threading.Tasks; namespace SingletonConsoleApp { class Program { const ssortingng InterprocessID = "{D2D6725E-79C3-4988-8475-4446549B6E6D}"; // can be anything that's unique static Mutex appSingletonMaker = new Mutex(true, InterprocessID); static void Main(ssortingng[] args) { if (appSingletonMaker.WaitOne(TimeSpan.Zero, true)) { var argHandler = new Action((arguments => { Console.WriteLine(Ssortingng.Join(" ", arguments)); })); Task.Run(() => { using (var server = new NamedPipeServerStream(InterprocessID)) { using (var reader = new StreamReader(server)) { using (var writer = new StreamWriter(server)) { while (true) { server.WaitForConnection(); var incomingArgs = reader.ReadLine().Split('\t'); writer.WriteLine("done"); writer.Flush(); server.Disconnect(); argHandler(incomingArgs); } } } } }); argHandler(args); Console.ReadKey(); appSingletonMaker.ReleaseMutex(); } else { if (args.Length > 0) { using (var client = new NamedPipeClientStream(InterprocessID)) { client.Connect(); var writer = new StreamWriter(client); using (var reader = new StreamReader(client)) { writer.WriteLine(Ssortingng.Join("\t", args)); writer.Flush(); reader.ReadLine(); } } } } } } } 

Vérifiez ce projet d’application console minimaliste