Comment puis-je faire une statique de la classe thread-safe?
J'ai un simple journalisation simple classe qui est statique. Cependant, ce n'est certainement pas "thread-safe" comme toutes les tentatives d'appel d'écrire dans le même fichier. Je reçois ces exceptions:
The process cannot access the file 'logfile.txt' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
...
Quelle est la meilleure façon de faire thread-safe?
public static class Logger
{
private static readonly string LOG_FILENAME = "logfile.txt";
private static readonly string LOG_FOLDER = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "App name");
private static readonly string LOG_FULLPATH = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "App name", LOG_FILENAME);
public static void LogMessageToFile(string msg)
{
msg = string.Format("{0:G}: {1}{2}", DateTime.Now, msg, Environment.NewLine);
File.AppendAllText(LOG_FULLPATH, msg);
}
}
Comme une fonction de journalisation, je voudrais être en mesure d'y accéder à partir de différentes parties de mon code (c'est pourquoi je l'ai choisi pour être statique). Cependant, j'imagine que pour faire thread-safe, je vais toujours avoir à passer d'un objet commun à lock (), je pense que de défaites le but d'une fonction statique. Ou n'est-ce pas le cas?
OriginalL'auteur Doug | 2013-05-14
Vous devez vous connecter pour publier un commentaire.
lock ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread attempts to enter a locked code, it will wait, block, until the object is released.
La solution est-elle préférable à la non-statique de la classe qui accepte un objet (avec peut-être un constructeur qui accepte une chaîne unique: le message doit être connecté), et de verrouillage qui?
+1. @raney de verrouillage de quoi? Vous avez besoin
lock
autour de l'écriture dans le fichier (il doit être au plus un objet de verrouillage de fichier par fichier, avoir une statique de verrouillage pour tous les fichiers est acceptable pour un exemple de code). Notez que pour une vraie journalisation, il serait préférable d'utiliser des solutions existantes.OriginalL'auteur Eugen Rieck
Dans votre LogMessageToFile méthode, vous avez besoin d'un lock pour éviter les multi-thread accès:
OriginalL'auteur Gisway