Comment éviter l'erreur de fichiersSystemwatcher en C #? P>
Trop de changements à la fois dans la répertoire p> blockQuote>
Je dois détecter toutes les modifications sur une part de réseau. Le micro-interrupteur est augmenté à 8192 * 128 P>
6 Réponses :
J'ai l'expérience que FileSystemwatcher n'est pas toujours la chose la plus fiable à utiliser. Vous pouvez spécifier le filtre pour affiner les fichiers que vous regardez (notifyfilter) ou augmentez la taille de la mémoire tampon. p>
Mais en fonction de vos besoins, vous pouvez également vouloir le faire d'une autre manière, comme l'interrogation toutes les x secondes pour obtenir la liste des fichiers. Mais alors vous devrez peut-être nous en dire plus sur votre cas de rentabilisation. P>
Le second essai s'écrase également: pour chaque notifyfilter c'est propre FSW. Je dois détecter toutes les modifications pour les engager dans une base de données (chemin de contrôle et checksum). L'interrogation sur une part de réseau de 2 To n'est pas suffisant - et oui, j'utilise déjà des commandes shell pour accéder à tous les chemins (beaucoup plus rapidement que System.IO).
Voir aussi Stackoverflow. com / questions / 239988 / ... qui indique que, lors de l'utilisation de cela sur une action, il n'est pas fiable et le sondage serait une meilleure option.
L'interrogation sur un 2 To n'est pas une option ;-) Merci.
Je suppose que vous n'avez pas à sonder chaque dossier en même temps. Vous pourriez avoir une autre stratégie qui divise mieux la charge lors du sondage.
Mon idée était de détecter des modifications dans un seul dossier (sous) et de les synchroniser via Win32 appels (FindFirstFile / FindNextFile) Il suffit de détecter les modifications apportées dans un dossier - pas d'importance que le fichier a été modifié. Mais cela semble aussi être trop
Eh bien, comme je l'ai dit, sur un partagé, il n'est tout simplement pas fiable, comme vous l'avez vécu :) Sondage peut être une bonne alternative.
Existe-t-il un moyen de détecter les changements de répertoire uniquement? Les changements DOC devraient soulever à chaque fois, sur chaque activité de fichier.
Voir Stackoverflow.com/Questtions/8513858/detect-changes-in-direct Ory , encore une fois, ils utilisent des interrogations pour cela.
Ok ... comme je pensais avant - tu as tort. Désolé. Je peux utiliser SHCHANGENOTIFYRuisse pour obtenir des notifications shell sans aucun tampon. Ce n'est pas assez facile mais il est possible sans interrogation. Merci.
Cela fonctionne (pour les 14 dernières heures). Je vous donnerais le code, mais cela n'est pas autorisé dans notre entreprise. Windows API Pack vous donne une belle emballage pour ShellObject et SCIRPNOFITICATION. Facile et utile.
de Msdn code>
; p>
Le système d'exploitation Windows notifie votre composant des modifications de fichier Dans un tampon créé par le
fichiersystemwatcher code>. S'il y a beaucoup Changements dans une courte période, le tampon peut déborder. Cela provoque la composant pour perdre une trace des changements dans le répertoire, et ce ne sera que fournir une notification générale. Augmenter la taille du tampon avec La propriété
interruptibuffersize code> est chère, comme cela vient de mémoire non pagaie qui ne peut pas être échangée sur le disque, alors gardez le tampon aussi petit mais assez grand pour ne pas manquer d'événements de changement de fichier. Pour éviter un débordement de mémoire tampon, utilisez le
notifyfilter code> et
includebdirectories code> des propriétés afin que vous puissiez filtrer le changement non désiré Notifications. P> blockQuote>
Je connais. J'ai créé 40 fichiers par Copy'N'Paste et l'erreur a été lancée. Juste 40 fichiers.
@Derabt hmm i>, on dirait que ce n'est pas trop. Êtes-vous sûr de ne rien faire d'autre?
Oui. Créé un fichier par «nouveau fichier texte» et copiez cela 40 fois dans le même dossier.
18 fichiers: fins 19 fichiers: échec (Textfiles vides!)
watcher.internalbuffersize * = 8;
SHCHANGENOTIFYRuisse peut être utilisé pour obtenir des notifications shell. P>
Il devrait être corrigé si vous augmentez la taille de la mémoire tampon mais que ce n'est pas une solution pratique. Parce que pour vous assurer qu'il enregistre toujours tout ce que vous auriez besoin de rendre le tampon énorme. Et cela affirmera la performance greenlly. Et je pense que les problèmes de performance pourraient être fixés en mettant en œuvre plusieurs threading. p>
Je pense que j'ai peut-être trouvé un motif qui peut aider à améliorer considérablement l'utilisation du tampon considérablement.
Le problème avec cette classe est que jusqu'à ce que les délégués pour les événements finissent, il ne peut pas libérer la mémoire qu'il utilise pour Tenez cette information. P>
Pour la vie de moi, je ne sais pas pourquoi le maximum interruptibuffersize a été défini sur 64 Ko, mais avec cette idée, vous utiliserez ce petit tampon beaucoup plus efficacement. P> < p> Si au lieu de faire les opérations à l'intérieur des délégués, vous les faisant de la file d'attente et de différer leur exécution pour un travailleur d'arrière-plan, la quantité de mémoire utilisée par elle sera considérablement plus petite. P>
En fait, j'ai aucune idée de la raison pour laquelle la classe en elle-même ne met pas en œuvre quelque chose comme celui-ci en premier lieu. p>
Le code ci-dessous est juste un exemple de code de code pour l'idée et ne doit pas être utilisé dans des environnements de production, Mais il a augmenté le nombre de fichiers que je pourrais copier et garder une trace de radicalement. p>
Il y a deux choses que vous devriez faire:
interrogebuffersize code> à la valeur prise en charge maximale (65536). Votre tentative de la définir sur "8192 * 128" est plus grande que la valeur supportée maximale répertoriée dans le documentation , de sorte que vous n'avez peut-être pas augmenté la taille de la mémoire tampon du tout. Li>
- Evénements de la file d'attente du
FileSystemwatcher code> sur un fil d'arrière-plan pour le traitement. LI>
ol> C'est le deuxième point ici qui n'est pas bien compris et devrait vraiment être documenté sur MSDN. En interne, FileSystemWatcher CODE> fait la queue des événements de modification dans ce tampon interne Vous définissez la taille ci-dessus. De manière critique, les articles ne sont supprimés que de ce tampon après que votre gestionnaire d'événement revienne forte>. Cela signifie que chaque cycle de frais généraux de votre événement introduit augmente la possibilité de remplir le tampon de remplissage. Ce que vous devriez faire, c'est effacer la file d'attente limitée du système de fichiers code> le plus rapidement possible et déplacez les événements dans votre propre file d'attente infinie, pour traiter à la vitesse que vous pouvez gérer ou jeter si vous souhaitez le faire. Donc, mais avec une intelligence autour de cela. P> Voici essentiellement ce que je fais dans mon code. Premièrement, je démarre mon propre thread de répartiteur: p> xxx pré> puis je crée l'observateur. Notez que la taille du tampon est définie. Dans mon cas, je ne regardez que des modifications dans le répertoire cible, pas des sous-répertoires: p> xxx pré> maintenant je joins mes manutentionnaires d'événements, mais je les invoque ici sur mon répartiteur plutôt que de les exécuter Synchroneusement dans le fil de l'observateur. Oui, les événements seront traités dans l'ordre par le répartiteur: p> xxx pré> et enfin, après avoir éliminé le FileSystemwatcher Code> (vous le faisiez. ?), vous devez fermer votre répartiteur: p> xxx pré> et c'est tout. Je reçois ce problème moi-même, à la fois dans les scénarios de réseau et locaux. Après avoir utilisé cette approche, je n'ai plus été en mesure de générer cette erreur, même lorsque vous martelez des fichiers vides pour regarder des annuaires aussi rapidement que possible. Si vous avez déjà réussi à faire l'échappement de la mémoire tampon dans ce cas (ce que je ne suis pas sûr est possible, l'API en amont est probablement plus lente), il y a encore plus de place pour l'optimisation ici. Tant que votre répartiteur est sur le "point de basculement", où l'expéditeur ne peut pas publier les événements plus rapidement que vous ne pouvez les envoyer, vous n'obtiendrez jamais un arriéré et ne soufflez jamais le tampon. Je crois que cette approche vous met dans cette zone de sécurité. P> P>
Et je viens de remarquer que Luis dit essentiellement la même chose il y a plus de deux ans. Oh bien, voici un exemple de code alternatif, et celui-ci est utilisé dans des environnements de production.
J'ai édité votre titre. S'il vous plaît voir, " Les questions incluent" Tags "dans leurs titres? ", où le consensus est "non, ils devraient ne pas".