Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        // 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);
                }
            });
        }