La croix-Processus de Verrouillage en C#
J'ai écrit une API qui va être utilisé sur la même case (1) un service de windows, (2) une application web, et (3) une application windows forms. Ils ont besoin de partager un très petit ensemble de données communes (quelques ints, une date, une chaîne que je pourrais mettre comme propriétés d'une même classe).
Quelle sorte de mécanisme de verrouillage puis-je utiliser de la croix-processus de sorte que les trois processus peuvent partager les ressources en toute sécurité et de ne pas courir dans les conflits?
Pas de bases de données s'il vous plaît, à la recherche d'une solution qui ne nécessite pas de dépendances supplémentaires. De préférence, la solution serait d'utiliser la mémoire partagée, ou le système de fichiers d'une certaine façon.
Vous fait a dit!
OriginalL'auteur Langdon | 2010-09-03
Vous devez vous connecter pour publier un commentaire.
Pour la croix-processus de verrouillage en C#/.Net, vous pouvez utiliser un nommé système de Mutex.
Je vois que vous êtes le spamming Stackoverflow avec beaucoup de questions (et les commentaires d'autres questions) à propos de ce "problème" que vous rencontrez. Un mutex est utilisé pour assurer un accès exclusif à une ressource partagée à travers des processus. Il n'est pas aussi planification du travail ou de l'accès sur plusieurs threads. Votre compréhension de la façon mutex - "Si trois méthodes sont l'appel de ce constructeur doivent tous s'appeler de manière séquentielle ou certains tourniquet." - n'est pas correct et c'est pourquoi vous n'obtenez pas le comportement que vous attendez.
OriginalL'auteur quentin-starin
Utiliser un EventWaitHandle objet de construire un événement donné que chaque processus de verrouillage ou de blocage. Travaille en .NET 2.0 et versions ultérieures.
OriginalL'auteur dthorpe
Si votre application réside sur un ordinateur, que vous pouvez utiliser interprocessus, les primitives de synchronisation comme nommé mutex et de la mémoire partagée.
Mais je pense que la meilleure approche serait d'utiliser quelque chose comme des services WCF (qui peut résider dans le service windows) et d'exposer toutes les informations nécessaires par le biais de contrat spécifié. Dans ce cas, tous cette application pourrait résider sur des machines différentes, mais de toute façon cette solution plus propre et robuste.
OriginalL'auteur Sergey Teplyakov
Vous pouvez utiliser MSMQ de fournir les files d'attente partagées entre vos applications, avec l'une des applications agissant en tant que maître; le service Windows serait le meilleur choix si il est toujours en cours d'exécution.
- Je utiliser Système.Les données.Sqlite pour la communication entre les services Windows et des applications. Même si vous avez dit pas de bases de données, vous trouverez peut-être ce digne d'un compromis. C'est une base de données intégrée avec aucune charge administrative. Vous "navire" il en incluant une seule DLL dans vos applications, et il enregistre vos données dans un seul fichier.
Penser que c'est un fichier de persistance que vous accédez à l'aide d'instructions SQL via ADO.Net; il arbore un LINQ interface. Vous obtenez de verrouillage par le biais de transactions courantes (avec restauration) et il offre également de chiffrement. Vous pouvez modifier et afficher son contenu à l'aide de Visual Studio Service de l'Explorateur. Il fonctionne sur .Net 3.5 et .Net 4. Et c'est open-source, sans aucune restriction. Vous pouvez ajouter des colonnes et des tables sans compromettre les fonctionnalités existantes. Depuis le déploiement est aussi simple que d'ajouter une DLL pour votre solution, il est beaucoup plus facile à déployer et prendre en charge. Et depuis que la chaîne de connexion des points dans un fichier, il est facile de le frapper à partir de machines distantes. Peut-être pas aussi élégant que les files d'attente partagées ou mutex, mais sa grandement simplifié les choses pour moi.
OriginalL'auteur Ed Power
Basé sur votre question, il semble que vous en avez besoin inter-processus de communication. Si l'un des processus les hôtes les données partagées et les autres processus qui ont besoin d'accéder à ces données.
Si ce qui précède est correct, vous pouvez utiliser simple dans le processus de verrouillage, comme un Moniteur afin de protéger les données partagées et d'exposer un WCF point de terminaison pour fournir l'accès aux données à partir d'un autre processus. À l'aide d'un tube Nommé de transport pour le fonds de roulement de la communication, sera très efficace pour la communication entre processus sur la même zone.
Il n'y aurait pas besoin de traverser processus de verrouillage, sauf si vous avez utilisé une ressource partagée comme un fichier mappé en mémoire de partager les données, mais pour être honnête, ce serait lourd et vous obliger à gérer beaucoup de choses manuellement que WCF en prendra soin, avec l'avantage que vous pourriez éventuellement à l'échelle de la case unique pour de multiples boîtes si jamais vous en avez besoin.
OriginalL'auteur Chris Taylor