public TaskScheduler(SyncItemQueue <FolderWatcherQueueItem> q, EventWaitHandle exitThreadEvent, Tasks.Common.Models.TaskFactory taskFactory, TimeSpan taskDelay, ScheduleTicker scheduleTicker) { _fileQueue = q; _queueEvents = new WaitHandle[] { exitThreadEvent, q.ItemsQueuedEvent }; _tickerEvents = new WaitHandle[] { exitThreadEvent, scheduleTicker.TickerEvent }; _taskFactory = taskFactory; _taskDelay = taskDelay; _scheduleTicker = scheduleTicker; }
public HueConnection() { // Limit the max buffer size for the response so we don't get overwhelmed _httpClient = new HttpClient { MaxResponseContentBufferSize = 256000 }; _httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); _queue = new SyncItemQueue <QueueItem>(true); _scheduleTicker = new ScheduleTicker(new Schedules.Common.Models.Schedule(), new TimeSpan(0, 0, 0, 0, ThrottleRate)); _exitThreadEvent = new ManualResetEvent(false); _queueEvents = new WaitHandle[] { _exitThreadEvent, _queue.ItemsQueuedEvent }; _tickerEvents = new WaitHandle[] { _exitThreadEvent, _scheduleTicker.TickerEvent }; _syncItemQueueResponses = new Dictionary <string, HueObjectBase>(); _consumerSyncRoot = new object(); }
/// <summary> /// This is the constructor /// </summary> /// <param name="queue">the item queue to use</param> /// <param name="exitThreadEvent">the event to trigger the folder watcher to exit</param> /// <param name="folderPath">the folder path to watch</param> /// <param name="filePattern">the file pattern filter</param> /// <param name="addParentFolder">this flag triggers an event for the parent folder to be added to the queue as well</param> public FolderWatcher(SyncItemQueue <FolderWatcherQueueItem> queue, EventWaitHandle exitThreadEvent, string folderPath, string filePattern, bool addParentFolder) { _queue = queue; _exitThreadEvent = exitThreadEvent; _folderWatcher = new FileSystemWatcher(folderPath, filePattern) { NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite, IncludeSubdirectories = true, EnableRaisingEvents = false }; _folderWatcher.Created += FolderWatcherChanged; _folderWatcher.Deleted += FolderWatcherChanged; _folderWatcher.Renamed += FolderWatcherRenamed; _folderWatcher.Changed += FolderWatcherChanged; _addParentFolder = addParentFolder; }
public void StartWatchFolder(string folderName) { _logHelper.WriteEntry(String.Format("Starting WatchFolder ServiceViewModel for {0}", folderName), MessageType.Information); WatchFolderSettings watchFolderSettings = _watchFolderSettingsHelper.Settings.WatchFoldersSettings[folderName]; // load task engines var pluginLoader = new PluginLoader <IPlugin>(); var taskFactory = new TaskFactory(); pluginLoader.LoadPlugins(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)); foreach (TaskEngineSettings taskEngineSettings in watchFolderSettings.TaskEnginesSettings) { taskFactory.AddToTaskEngines((ITaskEngine)pluginLoader.GetPlugin(taskEngineSettings.TypeName)); } _logHelper.WriteEntry(String.Format("{0} Task Engines detected for WatchFolder ServiceViewModel for {1}", taskFactory.TaskEngines.Count, folderName), MessageType.Information); if (taskFactory.TaskEngines.Count == 0) { _logHelper.WriteEntry(String.Format("{0} Task Engines detected for WatchFolder ServiceViewModel for {1}. Stopping", taskFactory.TaskEngines.Count, folderName), MessageType.Warning); return; } if (!_queues.ContainsKey(folderName)) { _queues[folderName] = new SyncItemQueue <FolderWatcherQueueItem>(); } else { _queues.Add(folderName, new SyncItemQueue <FolderWatcherQueueItem>()); } if (_exitThreadEvents.ContainsKey(folderName)) { _exitThreadEvents[folderName] = new ManualResetEvent(false); } else { _exitThreadEvents.Add(folderName, new ManualResetEvent(false)); } //deserialise queue from settings foreach (QueueStateItem queueItem in watchFolderSettings.Queue) { _queues[folderName].EnqueueSync(new FolderWatcherQueueItem { Path = queueItem.Path, Time = queueItem.DateTime }); } //var transcodeEngine = new FlacToMp3TranscodeEngine(); //var copyFolderArtEngine = new CopyFolderArtEngine(); //taskFactory.AddToTaskEngines(transcodeEngine); //taskFactory.AddToTaskEngines(copyFolderArtEngine); var scheduleTicker = new ScheduleTicker(watchFolderSettings.ScheduleSettings.GetSchedule(), watchFolderSettings.TimerInterval); var folderWatcher = new FolderWatcher(_queues[folderName], _exitThreadEvents[folderName], folderName, "*.*", true); var taskScheduler = new TaskScheduler(_queues[folderName], _exitThreadEvents[folderName], taskFactory, watchFolderSettings.InitialTaskDelay, scheduleTicker); if (!_producerThreads.ContainsKey(watchFolderSettings.FolderName)) { _producerThreads.Add(folderName, new Thread(folderWatcher.ThreadRun) { Name = String.Format("ProducerThread for {0}", watchFolderSettings.FolderName) }); } if (!_consumerThreads.ContainsKey(watchFolderSettings.FolderName)) { _consumerThreads.Add(folderName, new Thread(taskScheduler.ThreadRun) { Name = String.Format("ConsumerThread for {0}", watchFolderSettings.FolderName) }); } _producerThreads[folderName].Start(); _consumerThreads[folderName].Start(); _logHelper.WriteEntry(String.Format("Started WatchFolder ServiceViewModel for {0}", folderName), MessageType.Information); }