J'essaie d'implémenter une valeur d'identité auto-incrémentée basée sur le fichier (à l'adresse int
stockée dans un fichier TXT) et j'essaie de trouver la meilleure façon de gérer les problèmes de concurrence. Cette identité sera utilisée comme identifiant unique pour mon contenu. Lors de l'enregistrement d'un nouveau contenu, ce fichier est ouvert, la valeur est lue, incrémentée, le nouveau contenu est enregistré et la valeur incrémentée est réécrite dans le fichier (que nous stockions le prochain ID disponible ou le dernier émis n'a pas vraiment d'importance). Pendant ce temps, un autre processus peut arriver et essayer d'enregistrer un nouveau contenu. Le processus précédent ouvre le fichier avec FileShare.None
Ainsi, aucun autre processus ne pourra lire le fichier jusqu'à ce qu'il soit libéré par le premier processus. Bien que les chances que cela se produise soient minimes, cela peut tout de même arriver.
Lorsque cela se produit, nous avons deux options :
- attendre que le fichier devienne disponible -
Emuler l'attente de File.Open en C# lorsque le fichier est verrouillé
nous parlons de milisecondes ici, donc je suppose que ce ne serait pas un problème tant que quelque chose d'étrange se produit et que le fichier ne devient jamais disponible, alors cette solution résulterait en une boucle infinie, donc pas une solution idéale
- mettre en œuvre une sorte de file d'attente et exécuter toutes les opérations sur les fichiers dans une file d'attente. Mes exigences en matière d'expérience utilisateur sont telles qu'au moment de la sauvegarde/modification des fichiers, l'utilisateur ne devrait jamais être informé des exceptions ou du fait que quelque chose s'est mal passé - il en serait informé plus tard par le biais d'une interface utilisateur très conviviale lorsque les opérations échoueraient également dans la file d'attente.
Au moment de la rédaction de ce document, la solution doit fonctionner dans une application ASP.NET MVC (de manière synchrone et asynchrone via AJAX) mais, si possible, elle doit utiliser les concepts qui pourraient également fonctionner dans une application Silverlight ou Windows Forms ou WPF.
En ce qui concerne ces deux options, quelle est, selon vous, la meilleure et, pour la deuxième option, quelles sont les technologies possibles pour la mettre en œuvre ?