2008-10-20 4 views
1

Nous surveillons la progression d'une application personnalisée (dont la source n'est pas sous notre contrôle) qui écrit dans un manifeste XML. Parfois, l'application est bloquée en raison de l'impossibilité d'écrire dans le fichier manifeste. Bien que nous couvrons nos traces en fermant explicitement le handle de fichier en utilisant File.Close et en créant également les variables de fichier dans Using Blocks. Mais d'une manière ou d'une autre cela continue à se produire. (Notre application est multithread et au plus trois threads peuvent accéder au fichier.) Une autre chose intéressante est que leur application met à jour ce manifeste à trois événements différents (ajouter des éléments, supprimer des éléments, compléter des éléments) mais nous ne souffrons que d'un événement (achèvement des articles). Mon code est répertorié iciComment éviter le blocage de fichiers

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read)) 
{ 
    using (TextReader r = new StreamReader(st)) 
    { 
     var xml = r.ReadToEnd(); 
      r.Close(); 
      st.Close(); 
      //................ Rest of our operations 
    } 
} 
+0

espérons que le lien suivant vous aide. http://stackoverflow.com/questions/119548/problem-in-writing-to-single-file-in-web-service-in-net – pradeeptp

+0

Exactement la bonne chose à faire - en utilisant le verrouillage afin que les threads n'essaient pas pour accéder au fichier en même temps. A travaillé pour moi quand j'ai plusieurs threads se connectant au même fichier. Créez une bibliothèque pour gérer l'accès au fichier et vous êtes en or. – ScottCher

Répondre

2

Si vous lisez seulement à partir du fichier, vous devriez pouvoir passer un indicateur pour spécifier le mode de partage. Je ne sais pas comment vous spécifiez ceci dans .NET, mais dans WinAPI vous passeriez FILE_SHARE_READ | FILE_SHARE_WRITE à CreateFile().

Je vous suggère de vérifier la documentation de votre API de fichier pour voir où elle mentionne les modes de partage.

+0

Yup Il existe une constante FileShare. Merci, je vais essayer cela et voir comment cela fonctionne – Gripsoft

+0

Merci Ajout d'une constante FileShare fil de l'application semble se comprendre. Comme notre application était en train de lire, j'ai simplement utilisé l'attribut READ_WRITE pour les autres fichiers. De ce fait, leur application ouvre toujours le fichier. – Gripsoft

0

Le problème est différent parce que cette personne est d'avoir le plein contrôle sur l'accès aux fichiers pour tous les processus tout comme je l'ai mentionné UN PROCESSUS EST TIERS SANS SOURCE acccess. Et nos applications fonctionnent bien. Cependant, leur application semble bloquée s'ils ne peuvent pas obtenir le contrôle du fichier. Donc, je suis prêt à trouver une méthode d'accès aux fichiers qui ne perturbe pas leur fonctionnement.

1

Deux choses:

  1. Vous devez faire le reste de vos opérations en dehors des champs d'application des using déclarations. De cette façon, vous ne risquez pas d'utiliser le flux fermé et le lecteur. En outre, vous n'avez pas besoin d'utiliser les méthodes Close, car lorsque vous quittez la portée de l'instruction using, Dispose est appelée, ce qui est équivalent.
  2. Vous devez utiliser la surcharge qui a l'énumération FileShare. Le verrouillage est de nature paranoïaque, de sorte que le fichier peut être verrouillé automatiquement pour vous protéger de vous-même. :)

HTH.

0

Cela peut se produire si un thread essayait de lire à partir du fichier pendant qu'un autre écrivait. Pour éviter ce type de situation où vous voulez plusieurs lecteurs mais un seul écrivain à la fois, utilisez ReaderWriterLock ou .NET 2.0 la classe ReaderWriterLockSlim dans l'espace de noms System.Threading.

0

De plus, si vous utilisez 2.0+ .NET, vous pouvez simplifier votre code juste:

string xmlText = File.ReadAllText(ManifestFile); 

Voir aussi: File.ReadAllText on MSDN.