/// <summary> /// Start waiter thread from a List<job> /// </summary> /// <param name="jobList">The list of jobs to start the waiter thread from</param> /// <param name="e">The FileSystemEventArgs</param> /// <param name="hashedCacheElement">The HashedCacheElement (hashed file or directory name)</param> private void StartWaiterThreadFromJobList(List <Jobs> jobList, FileSystemEventArgs e, string hashedCacheElement) { foreach (var job in jobList) { if (FileDoesNotMatchFilter(e.Name, job.Service.AdvancedFileFilter)) { if (FileDoesNotMatchFilter(e.Name, job.Service.IgnoreFileFilter, true)) { if (StringIsEqualToFalse(job.Service.DelayTaskAfterLastEvent)) { FileLogger.Debug("Starting new thread..."); var thread = new Thread(() => RunCloudTransferTask(hashedCacheElement, job)); thread.Start(); } else { FileLogger.Debug("Starting new thread to wait for last event..."); var waiterThreadHelper = new WaiterThreadHelper() { HashedCacheElement = hashedCacheElement, e = e, Job = job }; StartWaiterThread(waiterThreadHelper); } } else { FileLogger.Debug("File matched IgnoreFileFilter, ignoring it!"); } } } }
/// <summary> /// Start a new thread wich will monitor a file / directory (if it has been modified). /// </summary> /// <param name="waiterThreadHelper"></param> private void StartWaiterThread(WaiterThreadHelper waiterThreadHelper) { var runningStatePrefix = "running_"; var thread = new Thread(() => { if (!MemoryCache.Default.Contains(runningStatePrefix + waiterThreadHelper.HashedCacheElement)) { SetCache(runningStatePrefix + waiterThreadHelper.HashedCacheElement, true); } Task.Run(async() => { var initialDateTime = DateTime.Now; var delayTaskAfterLastEvent = GetTimeInSecondsFromString(waiterThreadHelper.Job.Service.DelayTaskAfterLastEvent); var fileChanged = false; // === Fallback if int cannot be parsed (1 min) if (delayTaskAfterLastEvent == -2) { delayTaskAfterLastEvent = 60; } else { delayTaskAfterLastEvent += 2; } if (waiterThreadHelper.e.ChangeType != WatcherChangeTypes.Deleted) { var initialLastWriteTime = new FileInfo(waiterThreadHelper.e.FullPath).LastWriteTime; while (initialDateTime.AddMilliseconds(delayTaskAfterLastEvent * 1000) > DateTime.Now && !fileChanged) { var lastWriteTime = new FileInfo(waiterThreadHelper.e.FullPath).LastWriteTime; // === Check if file has been modified if (initialLastWriteTime == lastWriteTime) { await Task.Delay(sleepTimeInMillisecondsForModificationChecker); } else { fileChanged = true; break; } } } else { await Task.Delay(delayTaskAfterLastEvent * 1000); } if (fileChanged) { FileLogger.Debug("File has been modified while waiting for \"DelayTaskAfterLastEvent\" (" + waiterThreadHelper.Job.Service.DelayTaskAfterLastEvent + ") "); } else { if (MemoryCache.Default.Contains(runningStatePrefix + waiterThreadHelper.HashedCacheElement)) { MemoryCache.Default.Remove(runningStatePrefix + waiterThreadHelper.HashedCacheElement); RunCloudTransferTask(waiterThreadHelper.HashedCacheElement, waiterThreadHelper.Job); } } }); }); thread.Start(); }