private void RecursiveProjectBuildSync(RelatedProject projectForBuild) { if (!projectForBuild.IsBuilt) { Console.WriteLine($"project {projectForBuild.Id} start"); foreach (var dependedProjectForBuild in projectForBuild.DependedProject.Where(project => !project.IsBuilt)) { RecursiveProjectBuildSync(dependedProjectForBuild); } Thread.Sleep(1000); projectForBuild.IsBuilt = true; Console.WriteLine($"project {projectForBuild.Id} finished"); } }
private async void RecursiveProjectBuildAsync(RelatedProject projectForBuild) { if (!projectForBuild.IsBuilt) { projectForBuild.BuildingProcLock.WaitOne(); Console.WriteLine($"project {projectForBuild.Id} start"); var relatedForBuild = projectForBuild.DependedProject.Where(project => !project.IsBuilt).ToList(); if (relatedForBuild.Count() > 0) { var buildingTasks = new List <Task>(relatedForBuild.Count()); foreach (var project in relatedForBuild) { buildingTasks.Add(Task.Run(() => { RecursiveProjectBuildAsync(project); })); } await Task.Factory.ContinueWhenAll(buildingTasks.ToArray(), (tasks) => { if (!tasks.Any(t => t.IsFaulted)) { Thread.Sleep(1000); projectForBuild.IsBuilt = true; Console.WriteLine($"project {projectForBuild.Id} finished"); } projectForBuild.BuildingProcLock.ReleaseMutex(); } ); } else { Thread.Sleep(1000); projectForBuild.IsBuilt = true; Console.WriteLine($"project {projectForBuild.Id} finished"); } } }