public override void DownloadAll(IEnumerable<Uri> uris, DirectoryInfo output) { var poolName = string.Format("downloads to {0}", output.Name); var pool = new CustomThreadPool(poolName) { MinThreads = 1, MaxThreads = 4 }; pool.AfterWorkItem += ItemCompleted; foreach (Uri uri in uris) { var workItem = new DownloadItem(DownloadOne, uri, output); pool.AddWorkItem(workItem); } while(pool.WorkingThreads > 0) {} InvokeFinished(); }