private void CreateOrUpdate()
        {
            var locations = GetLocationList();

            // Loop all locations to find viable Sql Server V12 location
            foreach (var location in locations)
            {
                var asyncTaskList = new List <Task <bool> >();
                var awaitTaskList = new List <Task <bool> >();

                // Set first location
                ProvisioningParameters.Properties.LocationPrimary = location;

                // Loop through all the Parallel Provisiong Groups
                for (var group = 1; group <= _provisioningTasks.Max(p => p.GroupNo); group++)
                {
                    awaitTaskList = new List <Task <bool> >();

                    // Start tasks assigned to group
                    foreach (var provisioner in _provisioningTasks.Where(p => p.GroupNo == group))
                    {
                        var task = new Task <bool>(provisioner.RunCreateOrUpdate);
                        task.Start();

                        if (provisioner.WaitForCompletion)
                        {
                            awaitTaskList.Add(task);
                        }
                        else
                        {
                            asyncTaskList.Add(task);
                        }
                    }

                    // Wait for non-waiting tasks before continueing to group 5 (deploys the website)
                    // Certain settings are required from the previous groups
                    if (group == 4)
                    {
                        Task.WaitAll(asyncTaskList.ToArray());

                        // Check if errors occurred
                        if (asyncTaskList.Any(t => t.Result == false))
                        {
                            TasksCompleted = true;
                            ErrorsOccurred = true;

                            break;
                        }
                    }

                    // Await tasks marked for waiting
                    Task.WaitAll(awaitTaskList.ToArray());

                    // Check if Rollback is needed
                    if (_provisioningTasks.Any(t => t.RollbackRequired))
                    {
                        _provisioningTasks.ForEach(p => p.Status = "Queued");

                        var resourceGroup = _provisioningTasks.First(p => p.Service.Equals("Resource Group"));
                        ErrorsOccurred = !resourceGroup.RunRemove("Select Next V12 Location");

                        break;
                    }

                    // Check if errors occurred
                    if (awaitTaskList.Any(t => t.Result == false))
                    {
                        TasksCompleted = true;
                        ErrorsOccurred = true;

                        break;
                    }
                }
            }

            // Set completion status and automatically selected location
            AutomaticLocation = ProvisioningParameters.Properties.LocationPrimary;
            TasksCompleted    = true;

            // Mark scheduleTenant as provisioned
            if (_provisioningTasks.All(p => p.Status == "Deployed"))
            {
                ProvisioningCompleted = true;

                var tenantService = new TenantService();
                tenantService.SetProvisioningStatus(ProvisioningParameters.Tenant.TenantId, ProvisioningCompleted);
            }
        }
        private void CreateOrUpdate()
        {
            var locations = GetLocationList();

            // Loop all locations to find viable Sql Server V12 location
            foreach (var location in locations)
            {
                var asyncTaskList = new List<Task<bool>>();
                var awaitTaskList = new List<Task<bool>>();

                // Set first location
                ProvisioningParameters.Properties.LocationPrimary = location;

                // Loop through all the Parallel Provisiong Groups
                for (var group = 1; group <= _provisioningTasks.Max(p => p.GroupNo); group++)
                {
                    awaitTaskList = new List<Task<bool>>();

                    // Start tasks assigned to group
                    foreach (var provisioner in _provisioningTasks.Where(p => p.GroupNo == group))
                    {
                        var task = new Task<bool>(provisioner.RunCreateOrUpdate);
                        task.Start();

                        if (provisioner.WaitForCompletion)
                        {
                            awaitTaskList.Add(task);
                        }
                        else
                        {
                            asyncTaskList.Add(task);
                        }
                    }

                    // Wait for non-waiting tasks before continueing to group 5 (deploys the website)
                    // Certain settings are required from the previous groups
                    if (group == 4)
                    {
                        Task.WaitAll(asyncTaskList.ToArray());

                        // Check if errors occurred
                        if (asyncTaskList.Any(t => t.Result == false))
                        {
                            TasksCompleted = true;
                            ErrorsOccurred = true;

                            break;
                        }
                    }

                    // Await tasks marked for waiting
                    Task.WaitAll(awaitTaskList.ToArray());

                    // Check if Rollback is needed
                    if (_provisioningTasks.Any(t => t.RollbackRequired))
                    {
                        _provisioningTasks.ForEach(p => p.Status = "Queued");

                        var resourceGroup = _provisioningTasks.First(p => p.Service.Equals("Resource Group"));
                        ErrorsOccurred = !resourceGroup.RunRemove("Select Next V12 Location");

                        break;
                    }

                    // Check if errors occurred
                    if (awaitTaskList.Any(t => t.Result == false))
                    {
                        TasksCompleted = true;
                        ErrorsOccurred = true;

                        break;
                    }
                }
            }

            // Set completion status and automatically selected location
            AutomaticLocation = ProvisioningParameters.Properties.LocationPrimary;
            TasksCompleted = true;

            // Mark scheduleTenant as provisioned
            if (_provisioningTasks.All(p => p.Status == "Deployed"))
            {
                ProvisioningCompleted = true;

                var tenantService = new TenantService();
                tenantService.SetProvisioningStatus(ProvisioningParameters.Tenant.TenantId, ProvisioningCompleted);
            }
        }