2010-02-02 14 views
1

En faisant un peu de google, je suis venu à savoir qu'il «est utilisé pour suivre les actions du système de fichiers». Mais je ne débranche pas son utilité, l'observateur peut directement déclencher l'événement (s) sans le stocker dans un tampon intermédiaire !!Quel est le rôle de InternalBuffer dans .net FileWatcher

Est-il là pour convertir un flux asynchrone d'événements (copier/modifier des fichiers) en appels d'événements synchrones? En outre, je ne suis pas sûr que FileWatcher déclenche les événements de manière asynchrone.

Quelqu'un peut-il jeter un peu de lumière à ce sujet?

Répondre

1

L'API Windows sous-jacente qui fait fonctionner FileSystemWatcher est ReadDirectoryChangesW(). Notez le 2ème argument, lpBuffer. C'est une correspondance biunivoque avec le tampon interne dont vous pouvez définir la taille avec la propriété InternalBufferSize.

Un tampon est requis car Windows ne peut pas exécuter facilement le code utilisateur en réponse aux modifications de répertoire. Ces modifications sont détectées par les pilotes de système de fichiers respectifs, ils s'exécutent en mode noyau. Le code de mode utilisateur en cours d'exécution nécessite un commutateur de mode coûteux et un commutateur de contexte de thread, beaucoup trop coûteux pour chaque changement détecté. Le tampon est là pour collecter les modifications, attendre le démarrage du code du mode utilisateur et vider le tampon.

Il existe un mode de défaillance bien documenté pour FSW, il pourrait y avoir trop de changements à suivre. Vous verriez l'événement Error dans le code managé. Augmenter la taille de la mémoire tampon peut aider, beaucoup, le tampon par défaut est plutôt petit à 4096 octets. Le rendre arbitrairement grand n'est pas une bonne idée cependant, l'espace tampon est également requis dans le noyau et cela est pris dans le pool de mémoire du noyau. C'est une ressource limitée, engloutir de grandes quantités du pool affecte tous les programmes en cours d'exécution sur la machine.

1

Le Filewatcher devra demander tampon quand il ne peut pas tous les traiter à la fois, ce qui est principalement causée par le code que vous avez écrit pour réagir aux événements du FileSystemWatcher lancers francs. Pour autant que je sache, les événements FileSystemWatcher ne sont pas asynchonosly mais vous pouvez générer un thread dans un événement pour que la gestion de votre code soit asynchrone. Bien sûr, le système de fichiers peut changer plusieurs fichiers en une seule fois, comme supprimer tous les fichiers ou penser à copier coller.

J'espère que c'était clair.

2

Vous me manquez le point du tampon dans votre question, je pense.

De MSDN, FileSystemWatcher (Souligné par l'auteur):

The Windows operating system notifies your component of file changes in a buffer created by the FileSystemWatcher. If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide blanket notification.

Il est donc pas un tampon d'événements qu'il ne vous a pas parlé de encore, il est le tampon qu'il offre pour les fenêtres pour soutenir les notifications en premier lieu , sans avoir à interroger. Si Windows lance une énorme pile d'opérations sur cette instance, ce buffer débordera et vous, consommateur/utilisateur de FileSystemWatcher, perdrez quelques notifications.

+0

+1, meilleure réponse que la mienne =) –

0

Oui, FileSystemWatcher est utilisé pour suivre les modifications dans le système de fichiers. Il surveille un répertoire et signale les modifications suivantes à tous les fichiers dans le répertoire:

  • OnCreated: Appelé lorsqu'un fichier ou un répertoire est créé
  • OnChanged: Appelé lorsqu'un fichier ou un répertoire est modifié
  • OnRenamed: appelé lorsqu'un fichier ou un répertoire est renommé
  • OnDeleted: appelé lorsqu'un fichier ou un répertoire est supprimé

le « tampon interne » est de savoir comment le système d'exploitation envoie des informations au FileSyst emWatcher. Sa taille est contrôlée par la propriété "InternalBufferSize".

S'il y a trop de changements à la fois, le tampon interne peut se remplir. Alors, au lieu d'obtenir tous les changements individuels que vous obtenez une seule notification de modification:

  • OnError: Appelé lorsque des changements individuels ont été perdus en raison d'un dépassement de mémoire tampon

FileSystemWatcher fait des événements de déclenchement de manière asynchrone. Plus précisément, l'événement est déclenché chaque fois que le fichier change.