public void WaitAll()

in MPI/Serialization.cs [456:506]


            public void WaitAll(Communicator comm)
            {
                RequestList requests = new RequestList();
                Dictionary<Request, EventWaitHandle> waitHandles = new Dictionary<Request, EventWaitHandle>();
                Dictionary<Request, string> requestTags = new Dictionary<Request, string>();
                DateTime startTime = DateTime.UtcNow;
                int nextMinute = 1;
                var workItems = comm.Serialization.WorkItems;
                while (pendingCount > 0 || workItems.Count > 0 || requests.Count > 0)
                {
                    RequestGenerator workItem;
                    if (workItems.TryDequeue(out workItem))
                    {
                        var request = workItem.generator();
                        requests.Add(request);
                        waitHandles.Add(request, workItem.waitHandle);
                        requestTags.Add(request, workItem.Tag);
                    }
                    else
                    {
                        var request = requests.TestAny();
                        if (request != null)
                        {
                            waitHandles[request].Set();
                            waitHandles.Remove(request);
                            requestTags.Remove(request);
                        }
                    }
                    var elapsed = DateTime.UtcNow - startTime;
                    if (elapsed.TotalMinutes > nextMinute)
                    {
                        StringBuilder sb = new StringBuilder();
                        if (requestTags.Count > 0)
                        {
                            sb.Append(": ");
                            bool firstTime = true;
                            foreach (var tag in requestTags.Values)
                            {
                                if (!firstTime)
                                    sb.Append(",");
                                sb.Append(tag);
                                firstTime = false;
                            }
                        }
                        comm.Serialization.WaitLogger?.Invoke($"Waiting on {pendingCount} pending tasks, {workItems.Count} work items, {requests.Count} requests{sb.ToString()}");
                        nextMinute++;
                    }
                }
                if (waitHandles.Count != 0)
                    throw new Exception("waitHandles.Count != 0");
            }