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");
                }
            }
        }