2012-04-02 4 views
0

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

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

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"); 
     } 

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

ответ

2

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

Создайте экземпляр 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 заявлении.

 Смежные вопросы

  • Нет связанных вопросов^_^