Multithread uygulamalarda güvenli dosya yazma işlemi

25 Aralık 2020 3 dk okuma süresi 217 okunma

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();
            }
        }
 }
}
Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
"The remote certificate is invalid according to the validation procedure" hatası ve çözümü

Kestrel, Code Modules ve Http.Sys gibi sunucu kavramları ve açıklamaları

Dotnet Core ile gelen requestin ajax olup olmadığını anlamamıza yarayan attribute