/// <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();
        }