невозможно записать в файл, который занят другим процессом exp, многопоточность - PullRequest
1 голос
/ 29 ноября 2010

Здравствуйте, у меня проблема с размещением журналов с использованием многопоточности, моя функция выглядит следующим образом

    public static void AddToLog(string message)
    {
            using (FileStream fs = new FileStream(ExeDir + @"\logs.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                using (StreamWriter mStreamWriter = new StreamWriter(fs))
                {
                    mStreamWriter.BaseStream.Seek(0, SeekOrigin.End);
                    mStreamWriter.WriteLine(message + " at " + DateTime.Now.ToLongTimeString() + "." +
                                            DateTime.Now.Millisecond);
                    mStreamWriter.Flush();
                }
            }
    }

И я каждый раз создаю этот объект, поэтому не могу его заблокировать, проблема в том, когда я его открываю, как лучше это сделать?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2010

У меня проблема с размещением журналов с использованием многопоточности

Вы должны использовать библиотеку журналов.Для .NET доступно много таких, как log4net .См. Также:

Если вы хотите реализовать ее самостоятельно, тогда учитывайте выходВаше приложение в единый компонент.Откройте файл один раз при запуске приложения и выполните регистрацию через четко определенный интерфейс с соответствующей синхронизацией в реализации.Не пишите напрямую в один и тот же файл журнала из разных мест вашего приложения.

1 голос
/ 29 ноября 2010

Ваш метод уже статичен, если вы используете один экземпляр приложения, просто добавьте

  private static object logLock = new object();
  public static void AddToLog(string message)
  {
     lock(logLock)  // or with a timeout
     {
        ...

Но я думаю, у @Mark есть лучший совет по использованию специальной библиотеки.

1 голос
/ 29 ноября 2010

Взгляните также на модификатор FileShare (http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx)

(но +1 для регистрации предложений библиотеки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...