public void StartCopying(string src, string dest) { List <TaskDelegate> taskDelegates = new List <TaskDelegate>(); List <String> dirFileList = GetFiles(src); FileAttributes attr = File.GetAttributes(dest); if (!attr.HasFlag(FileAttributes.Directory)) { return; } Directory.CreateDirectory(dest); CreateMissingDirs(src, dest); foreach (var file in dirFileList) { string fileName = file.Replace(src, dest); taskDelegates.Add(delegate { try { File.Copy(file, fileName, true); Interlocked.Increment(ref _copiedFiles); _logBuffer.Add("from: " + file + ", to: " + fileName + " by " + Thread.CurrentThread.Name); } catch (Exception e) { Console.WriteLine(e); } }); } Parallel.WaitAll(taskDelegates.ToArray()); PrintCopiedFiles(); }