come un esercizio di curiosità più che altro, si consideri la seguente semplice classe di registrazione:NET 2.0: File.AppendAllText (...) - thread-safe implementazione
internal static class Logging
{
private static object threadlock;
static Logging()
{
threadlock = new object();
}
internal static void WriteLog(string message)
{
try
{
lock (threadlock)
{
File.AppendAllText(@"C:\logfile.log", message);
}
}
catch
{
...handle logging errors...
}
}
}
È il lock
bisognosi in tutto File.AppendAllText(...)
o il metodo è intrinsecamente thread-safe dalla sua stessa implementazione?
La ricerca di informazioni su questo produce molte informazioni contraddittorie, alcuni dicono di sì, altri dicono di no. MSDN non dice nulla.
Questo è contraddittorio. Se File.AppendAllText ha un blocco di scrittura esclusivo, perché è necessario un blocco separato? – iheanyi
Hai frainteso, è il file che è bloccato per la scrittura. Quindi qualsiasi altro thread che tenta di scrivere allo stesso tempo riceverà un'eccezione. Per evitare ciò, è necessario serializzare le scritture utilizzando un blocco nel programma. – Pradeep
Non sprecare le preziose risorse del database per la registrazione se si utilizza un database relazionale pesante, altrimenti se si utilizza un database lite nosql, non è male accedere al database. Utilizzare qualcosa come il registro eventi di Windows se si desidera effettuare il login localmente, ma non scrivere direttamente sul file system. Ma perché non scrivere un nuovo file per log piuttosto che append se hai bisogno di essere thread safe e non-blocking? –