public bool Add(string sourceFile, bool immediate) { var targetFile = ResolveTargetFile(sourceFile); if (!validateFile(targetFile)) { return(false); } lock (queues) { if (!queues.Contains(sourceFile)) { if (immediate) { queues.AddFirst(sourceFile); } else { queues.AddLast(sourceFile); } } if (task?.IsCompleted ?? true) { task = Task.Factory.StartNew(() => { for (;;) { var thisSourceFile = (string)null; try { lock (queues) { if (queues.Count > 0) { thisSourceFile = queues.First(); queues.Remove(thisSourceFile); } else { Idle?.Invoke(); task = null; break; } } if (File.Exists(thisSourceFile) || Directory.Exists(thisSourceFile)) { Upload(thisSourceFile); } } catch (Exception ex) { logError(ex); syncClient.Close(); Thread.Sleep(1000); if (!string.IsNullOrEmpty(thisSourceFile)) { lock (queues) { queues.AddLast(thisSourceFile); } } } } }, TaskCreationOptions.LongRunning); } } return(true); }