Multithread uygulamalarda güvenli dosya yazma işlemi
Log yazarken dosyaya erişim ile ilgili sıkıntılar yaşanabiliyor. Genellikle farklı bir thread ilgili dosya üzerinde işlemler yapıyor olabiliyor. Bu nedenle diğer thread hataya düşüyor ve karşınıza "The process cannot access the file '{path}' because it is being used by another process" şeklinde hata geliyor.
Bunu aşabilmek çok kolay. Dosyayı bir işlem sırasında kilitlemek ve işlem bitince tekrar kilidi açmak. Microsoft'un System.Threading kütüphanesinde zaten bunun için gerekli her şey var. Yapmanız gereken ReaderWriterLockSlim class'ını kullanmak (MSDN). Bu sayede bir thread işlemini bitirmeden diğeri işlem yapmıyor ve kodunuz da hataya düşmüyor. Hatta bir Windows Service kullanıyorsanız bu hatadan dolayı servisiniz sürekli durabilir.
using System.Threading.Tasks; namespace Logger { public class LogHelper { private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim(); public LogHelper(IHostEnvironment environment) { } public void WriteLog(string log) { _readWriteLock.EnterWriteLock(); try { File.AppendAllText(filePath, log); } finally { _readWriteLock.ExitWriteLock(); } } public async Task WriteLogAsync(string log) { _readWriteLock.EnterWriteLock(); try { await File.AppendAllTextAsync(filePath, log); } finally { _readWriteLock.ExitWriteLock(); } } } }