FileSystemWatcher vs polling om te kijken naar bestandswijzigingen

Ik moet een applicatie opzetten die let op bestanden die worden aangemaakt in een directory, zowel lokaal als op een netwerkstation.

Zou de FileSystemWatcherof polling op een timer de beste optie zijn. Ik heb beide methoden in het verleden gebruikt, maar niet uitgebreid.

Welke problemen (prestaties, betrouwbaarheid enz.) zijn er met beide methoden?


Antwoord 1, autoriteit 100%

Ik heb de bestandssysteemwachter zien mislukken in productie- en testomgevingen. Ik beschouw het nu als een gemak, maar ik beschouw het niet als betrouwbaar. Mijn patroon was om te kijken naar veranderingen met de bestandssysteemwachter, maar af en toe te pollen om ontbrekende bestandswijzigingen op te vangen.

Bewerken: als je een gebruikersinterface hebt, kun je je gebruiker ook de mogelijkheid geven om te “verversen” voor wijzigingen in plaats van te pollen. Ik zou dit combineren met een bestandssysteem-watcher.


Antwoord 2, autoriteit 54%

Het grootste probleem dat ik heb gehad is het ontbreken van bestanden wanneer de buffer vol raakt. Makkelijk op te lossen – verhoog gewoon de buffer. Onthoud dat het de bestandsnamen en gebeurtenissen bevat, dus verhoog het tot het verwachte aantal bestanden (met vallen en opstaan). Het gebruikt geheugen dat niet kan worden uitgewisseld, dus het kan andere processen dwingen om te bladeren als het geheugen bijna op is.

Hier is het MSDN-artikel over buffer:
FileSystemWatcher..::.InternalBufferSize-eigenschap

Per MSDN:

Het vergroten van de buffergrootte is duur, omdat het afkomstig is van niet-wisselbaar geheugen dat niet kan worden uitgewisseld naar schijf, dus houd de buffer zo klein mogelijk. Om een ​​bufferoverloop te voorkomen, gebruikt u de eigenschappen NotifyFilter en IncludeSubdirectories om ongewenste wijzigingsmeldingen uit te filteren.

We gebruiken 16 MB vanwege een grote batch die in één keer wordt verwacht. Werkt prima en mist nooit een bestand.

We lezen ook alle bestanden voordat we er zelfs maar één beginnen te verwerken… zorg dat de bestandsnamen veilig worden opgeslagen in de cache (in ons geval in een databasetabel) en verwerk ze vervolgens.

Voor problemen met bestandsvergrendeling spawn ik een proces dat wacht tot het bestand wordt ontgrendeld, een seconde wachten, dan twee, dan vier, enzovoort. We nooitpollen. Dit is ongeveer twee jaar foutloos in productie geweest.


Antwoord 3, autoriteit 31%

De FileSystemWatcherkan ook wijzigingen missen tijdens drukke tijden, als het aantal wijzigingen in de wachtrij de beschikbare buffer overloopt. Dit is niet per se een beperking van de .NET-klasse, maar van de onderliggende Win32-infrastructuur. Onze ervaring is dat de beste manier om dit probleem te minimaliseren, is om de meldingen zo snel mogelijk uit de wachtrij te halen en ze op een andere thread af te handelen.

Zoals vermeld door @ChillTemp hierboven, werkt de watcher mogelijk niet op niet-Windows-shares. Het werkt bijvoorbeeld helemaal niet op gekoppelde Novell-schijven.

Ik ben het ermee eens dat een goed compromis is om af en toe een poll te houden om gemiste wijzigingen op te halen.


Antwoord 4, autoriteit 16%

Houd er ook rekening mee dat bestandssysteemwachter niet betrouwbaar is voor bestandsshares. Vooral als de bestandsshare wordt gehost op een niet-windows-server. FSW mag niet worden gebruikt voor iets kritisch. Of moet worden gebruikt met af en toe een peiling om te controleren of er niets is gemist.


Antwoord 5, autoriteit 11%

Persoonlijk heb ik de FileSystemWatcherop een productiesysteem gebruikt en het werkte prima. In de afgelopen 6 maanden heeft het geen enkele storing gehad die 24×7 draait. Het bewaakt een enkele lokale map (die wordt gedeeld). We hebben een relatief klein aantal bestandsbewerkingen dat het moet verwerken (10 gebeurtenissen die per dag worden afgevuurd). Het is niet iets waar ik me ooit zorgen over heb hoeven maken. Ik zou het opnieuw gebruiken als ik de beslissing opnieuw moest nemen.


Antwoord 6, autoriteit 6%

Ik gebruik momenteel de FileSystemWatchervoor een XML-bestand dat gemiddeld elke 100 milliseconden wordt bijgewerkt.

Ik heb ontdekt dat zolang de FileSystemWatchercorrect is geconfigureerd, u nooit problemen zou moeten hebben met lokalebestanden.

Ik heb geen ervaring met het op afstand bekijken van bestanden en niet-Windows-shares.

Ik zou het pollen van het bestand als overbodig beschouwen en de overhead niet waard, tenzij je inherent de FileSystemWatcherwantrouwt of direct de beperkingen hebt ervaren die iedereen hier heeft genoemd (niet-Windows-shares en externe bestanden kijken).


Antwoord 7, autoriteit 5%

Ik heb problemen ondervonden bij het gebruik van FileSystemWatcherop netwerkshares. Als je in een pure Windows-omgeving bent, is het misschien geen probleem, maar ik keek naar een NFS-share en aangezien NFS stateless is, was er nooit een melding wanneer het bestand dat ik aan het bekijken was, veranderde.


Antwoord 8, autoriteit 4%

Ik zou voor polling gaan.

Netwerkproblemen zorgen ervoor dat de FileSystemWatcheronbetrouwbaar is (zelfs bij overbelasting van de foutgebeurtenis).


Antwoord 9, autoriteit 3%

Ik had enkele grote problemen met FSW op netwerkschijven: het verwijderen van een bestand veroorzaakte altijd de foutgebeurtenis, nooit de verwijderde gebeurtenis. Ik heb geen oplossing gevonden, dus ik vermijd nu de FSW en gebruik polling.

Aan de andere kant werkten aanmaakgebeurtenissen prima, dus als je alleen hoeft te letten op het maken van bestanden, kun je voor de FSW gaan.

Ik had ook helemaal geen problemen met lokale mappen, of ze nu gedeeld werden of niet.


Antwoord 10, autoriteit 3%

Zo snel mogelijk terugkeren van de gebeurtenismethode, met behulp van een andere thread, loste het probleem voor mij op:

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    Task.Run(() => MySubmit(e.FullPath));
}

Antwoord 11, autoriteit 2%

Het gebruik van zowel FSW enpolling is naar mijn mening een verspilling van tijd en middelen, en het verbaast me dat ervaren ontwikkelaars dit suggereren. Als je polling moet gebruiken om te controleren op “FSW-missers”, dan kun je natuurlijk FSW helemaal weggooien en alleen polling gebruiken.

Ik probeer momenteel te beslissen of ik FSW ofpolling zal gebruiken voor een project dat ik ontwikkel. Als je de antwoorden leest, is het duidelijk dat er gevallen zijn waarin FSW perfect in de behoeften voorziet, terwijl je op andere momenten een enquête nodignodig hebt. Helaas heeft geen antwoordhet prestatieverschil(als dat er is) opgelost, alleen de problemen met de “betrouwbaarheid”. Is er iemand die dat deel van de vraag kan beantwoorden?

EDIT: nmclean‘s punt voor de geldigheid van het gebruik van zowel FSW als polling (je kunt de discussie in de opmerkingen lezen, als je geïnteresseerd bent) lijkt een zeer rationele verklaring te zijn waarom er kunnen situaties zijn waarin het gebruik van zowel een FSW als polling efficiëntis. Bedankt dat je daar licht op werpt voor mij (en iedereen die dezelfde mening heeft), nmclean.

Other episodes