public static void WaitAllEx( IWorkItemResult[] passedWorkItemResults) { ArrayList workItemResults = new ArrayList(passedWorkItemResults); ArrayList pendingWorkItemResults = new ArrayList(); int prevCount = workItemResults.Count; while (workItemResults.Count > 0) { foreach (IWorkItemResult workItemResult in workItemResults) { if (!workItemResult.IsCompleted) { pendingWorkItemResults.Add(workItemResult); } } workItemResults = new ArrayList(pendingWorkItemResults); pendingWorkItemResults.Clear(); if (workItemResults.Count == 0) { return; } if (prevCount != workItemResults.Count) { prevCount = workItemResults.Count; ChoTrace.WriteLineIf(ChoTrace.ChoSwitch.TraceVerbose, String.Format("Waiting for {0} thread(s) to complete...", workItemResults.Count)); Thread.Sleep(1000); } else { Thread.Sleep(5000); } } }