2008-10-14 9 views
1

J'ai déployé le site Web ASP.NET et le service Web ASP.NET sur le même serveur Web. Les deux nécessitent un accès au fichier partagé.Comment synchroniser l'accès au fichier entre le site Web ASP.NET et le service Web ASP.NET sur un serveur Web

Comment implémenter/partager un verrou qui prend en charge les rédacteurs uniques et les lecteurs multiples? Si quelqu'un lit, personne ne peut écrire, mais tout peut encore lire. Si quelqu'un écrit, personne ne peut lire/écrire.

Répondre

2

Pour ouvrir un fichier en écriture et permettre à d'autres threads de le lire, utilisez la méthode System.IO.File.Open avec System.IO.FileShare.Read. -À-dire .:

System.IO.File.Open("path.txt",System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.ReadWrite,System.IO.FileShare.Read) 

Autres (lecture) fils doit utiliser System.IO.FileAccess.Read

Signature de la méthode ouverte:

public static FileStream Open(string path, FileMode mode, FileAccess access, FileShare share); 

MISE À JOUR Si vous avez besoin de toutes les instances ocasionally écrire déposer. Utilisez la classe Mutex pour réserver l'écriture de fichier. C'est à dire:

Mutex mut = new Mutex("filename as mutex name"); 
    mut.WaitOne(); 
    //open file for write, 
    //write to file 
    //close file 
    mut.ReleaseMutex(); 

Espérons que ça aide.

0

Eh bien, vous pouvez faire quelque chose comme ceci:

public class yourPage { 
    static object writeLock = new object(); 
    void WriteFile(...) { 
     lock(writeLock) { 
       var sw = new StreamWriter(...); 
       ... write to file ... 
     } 
} 

Fondamentalement, cette solution est seulement bon pour les cas où le dossier sera ouvert pour écrire un court laps de temps. Vous souhaiterez peut-être envisager de mettre en cache le fichier pour les lecteurs ou d'écrire le fichier dans un fichier temporaire, puis de le renommer pour minimiser les conflits.

+0

Cela ne serait-il pas inutile si deux objets différents de cette classe sont créés chacun dans son propre thread? Chacun d'entre eux obtiendrait une copie de writeLock, rendant ainsi l'ensemble du schéma de verrouillage inutile. Je crois que le writeLock devrait être déclaré "en amont" avant que les différents threads soient créés, comme dans le fichier Global.asax. –

+0

@Tudor: Si l'objet est "statique", il n'y a qu'une seule instance par processus, pas par thread. La variable est vraiment globale à tous les threads. Vous pouvez, cependant, le décorer avec un attribut [ThreadStatic], et ce serait exactement comme vous le décrivez (inutile!) –

1

Utilisez la classe ReaderWriterLock ou ReaderWriterLockSlim (.NET 2.0) de l'espace de noms System.Threading pour gérer des cas de graveur unique/plusieurs lecteurs.

Questions connexes