/// <summary> /// Removes the given outage from the outage log. /// </summary> /// <param name="outage">The outage to be removed from the outage log.</param> /// <returns>True if the outage was removed; false otherwise.</returns> public bool Remove(Outage outage) { bool removed; bool modified; using (FileStream stream = GetFileLock(File.OpenWrite)) using (StreamReader reader = new StreamReader(stream)) using (StreamWriter writer = new StreamWriter(stream)) { List <Outage> outages = ReadLog(reader); modified = !m_outages.SequenceEqual(outages); outages.AddRange(m_outages); outages = Outage.MergeOverlapping(outages).ToList(); removed = outages.Remove(outage); modified |= !m_outages.SequenceEqual(outages); if (modified) { m_outages.Clear(); m_outages.AddRange(outages); stream.SetLength(0L); WriteLog(writer); } } if (modified) { LogModified?.Invoke(this, EventArgs.Empty); } return(removed); }
// Watches for changes to the log and adds additional outages entered by external processes. private void m_logFileWatcher_Changed(object sender, FileSystemEventArgs e) { long lastWriteTime = File.GetLastWriteTimeUtc(m_fileName).Ticks; if (Interlocked.Exchange(ref m_lastReadTime, lastWriteTime) == lastWriteTime) { return; } if (Interlocked.CompareExchange(ref m_suppressFileWatcher, 0, 1) == 1) { return; } ThreadPool.QueueUserWorkItem(state => { try { bool modified; using (FileStream stream = GetFileLock(File.OpenWrite)) using (StreamReader reader = new StreamReader(stream)) using (StreamWriter writer = new StreamWriter(stream)) { List <Outage> outages = ReadLog(reader); modified = !m_outages.SequenceEqual(outages); if (modified) { outages.AddRange(m_outages); m_outages.Clear(); m_outages.AddRange(Outage.MergeOverlapping(outages)); stream.SetLength(0L); WriteLog(writer); } } if (modified) { LogModified?.Invoke(this, EventArgs.Empty); } } catch (Exception ex) { OnProcessException(ex); } }); }