private void ProcessEvents(object sender, ElapsedEventArgs e) { // Allow only one Timer event to be executed. if (Monitor.TryEnter(m_EnterThread)) { // Only one thread at a time is processing the events try { // Lock the Collection, while processing the Events lock (m_Events.SyncRoot) { MusicShareWatcherEvent currentEvent = null; for (int i = 0; i < m_Events.Count; i++) { currentEvent = m_Events[i] as MusicShareWatcherEvent; switch (currentEvent.Type) { case MusicShareWatcherEvent.EventType.Create: case MusicShareWatcherEvent.EventType.Change: AddUpdateSong(currentEvent.FileName); break; case MusicShareWatcherEvent.EventType.Delete: musicDB.DeleteSong(currentEvent.FileName, true); Log.Info(LogType.MusicShareWatcher, "Deleted Song: {0}", currentEvent.FileName); break; case MusicShareWatcherEvent.EventType.DeleteDirectory: musicDB.DeleteSongDirectory(currentEvent.FileName); Log.Info(LogType.MusicShareWatcher, "Deleted Directory: {0}", currentEvent.FileName); break; case MusicShareWatcherEvent.EventType.Rename: if (musicDB.RenameSong(currentEvent.OldFileName, currentEvent.FileName)) { Log.Info(LogType.MusicShareWatcher, "Song / Directory {0} renamed to {1]", currentEvent.OldFileName, currentEvent.FileName); } else { Log.Info(LogType.MusicShareWatcher, "Song / Directory rename failed: {0}", currentEvent.FileName); } break; } m_Events.RemoveAt(i); i--; // Don't skip next event } } } finally { Monitor.Exit(m_EnterThread); } } }