Доступ к файлам в Windows Service - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть служба Windows, которая имеет 8 таймеров, работающих параллельно (истекшее время = 10 секунд), и каждый таймер выполняет определенную деятельность и регистрирует write_time, когда он входит в таймер, и end_time, когда он выходит из таймера, и этослучается для всех таймеров.У меня есть приложение ASP.net, которое читает журналы для write_time и end_time для каждого таймера и отображает его в сетке.

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

Write_time

        FileInfo file = null;
        StreamWriter write = null;
        try
        {
            file = new FileInfo(ConfigurationManager.AppSettings["SupportFilePath"].ToString() + processName + "_Log.txt");

            write = new StreamWriter(file.FullName);
            write.Write(string.Empty);

            write.Write(processName + "_" + time + " at: _" + System.DateTime.Now.ToString());
            write.Close();
            write.Dispose();

        }
        catch (System.Exception ex)
        {
            _errorMonitoringEngine.ErrorInfo(" ", ex.StackTrace.ToString(), ex.Message, "Email Notification Engine", "WriteTimeProcess2");
        }

Я получаю максимальное количество раз за исключением The process cannot access the file.Посоветуйте, пожалуйста, как от этого избавиться.

1 Ответ

2 голосов
/ 12 апреля 2012

Скорее всего, два или более потоков пытаются записать в один и тот же файл одновременно.

Создайте экземпляр object где-то в вашем классе и lock его всякий раз, когда вам нужно написатьв файл.

public class Example
{

  // ...

  // Depending on whether there are one or many instances of 
  // this class determines whether this needs to be static 
  // or not. If it needs to be static, use a static constructor.
  private object syncObject = new object();

  // ...

  void WriteToFile()
  {
    lock (syncObject)
    {
       // Do file IO
       // Now no two threads will attempt to access the file at the same time
    }
  }

  // ...

}

Было бы также целесообразно включить StreamWriter в оператор using.

...