2009-07-15 7 views
1

J'ai une application Web qui enregistre des informations dans un fichier. Je suis à la recherche d'un simple classeur de fichiers non-bloquant thread-safe dans C#. J'ai peu d'expérience avec le filetage. Je sais qu'il existe d'excellents composants de journalisation comme Log4Net, Enterprise Logging Block, ELMAH, mais je ne veux pas de dépendance externe pour mon application. Je pensais utiliser cette implémentation de file d'attente http://www.codeproject.com/KB/cpp/lockfreeq.aspxClasse d'enregistreur de fichier non bloquant simple, à thread sécurisé, dans C#

Répondre

0

La méthode FileStream.BeginWrite pousse l'opération d'écriture sur un thread géré par le système. C'est le peu facile.

Si vous placez vos messages dans une file d'attente synchronisée et que la méthode EndWrite retire l'élément suivant de la file d'attente, toute votre journalisation sera hors-fil en ce qui concerne l'application. La dernière étape consiste à placer des messages dans la file d'attente pour définir un événement, de sorte que si la file d'attente est vide lorsque EndWrite vient rechercher le message suivant, il peut attendre que l'événement soit défini.

1

si vous ne voulez pas utiliser la bibliothèque externe, vous pouvez utiliser Trace classe

+1

Je voterais également pour la classe Trace lorsqu'une dépendance externe n'est pas requise. De plus, de nombreux développeurs ajoutent simplement des composants comme Log4net et Enterprise Lib sans tenir compte de la complexité de leur application. Les classes de débogage et de trace dans .NET peuvent suffire pour de nombreuses petites et moyennes applications. Vous pouvez personnaliser leur comportement en modifiant les entrées de configuration ou en écrivant votre propre TraceListener. – A9S6

0

Je l'ai fait un mécanisme simple de l'exploitation forestière dans mon projet dans le bureau.

J'ai une classe log qui est partagée (C# statique).

A l'intérieur de cette classe, j'ai une file d'attente synchronisée, et elle a son propre thread.

Puis à l'intérieur de ce fil, je l'ai juste utiliser un AutoresetEvent avec votre propre WaitTime défini (j'utilise 250ms).

Ensuite, lorsque ce ResetEvent expire, je recueille ce qui est actuellement dans la file d'attente (en utilisant DeQueue) et j'écris chaque fichier dans le fichier. Choses à retenir ... Avoir une classe ou une structure qui peut contenir la date à laquelle l'entrée est entrée, plutôt que l'heure à laquelle vous avez écrit sur le disque, vous devez choisir un délai plus long pour dormir votre thread.

Si vous souhaitez que votre application se ferme rapidement, exposez une méthode permettant à l'option Définir l'événement de la mettre hors tension et de quitter normalement.

+0

Pouvez-vous montrer du code? – M4N

+0

Je viens avec la même solution, mais ensuite réalisé lorsque vous utilisez DeQueue vous bloquez la file d'attente ainsi vous bloquez la journalisation. Même cela arrive tous les 250ms, vous bloquez toujours. – tesla

Questions connexes