private void TryDeployment(bool retry)
        {
            if (!retry)
            {
                _publishControlMap.Clear();
                statusPanel.Controls.Clear();
            }

            this.lblStatus.Text             = string.Empty;
            this.btnRetry.Visible           = false;
            this.progressPictureBox.Visible = true;
            this.feedbackButton.Visible     = false;
            this.btnClose.Visible           = false;
            // Start local websites scan in a background thread.

            if (retry)
            {
                MainForm.WriteTrace("Retrying ..");
                foreach (var server in this.IISServers.Servers.Values)
                {
                    foreach (var site in server.Sites.Where(s => (!s.ContentPublishState || !s.DbPublishState)))
                    {
                        PublishStatus pubStatus;
                        if (_publishControlMap.TryGetValue(site.ServerName + site.SiteName, out pubStatus))
                        {
                            if (!site.ContentPublishState)
                            {
                                pubStatus.ResetContentStatus();
                            }
                            else
                            {
                                pubStatus.ResetDbStatus();
                            }
                        }
                        else
                        {
                            MainForm.WriteTrace("No control found for site: {0}", site.SiteName);
                        }
                    }
                }
            }
            else
            {
                foreach (var server in this.IISServers.Servers.Values)
                {
                    foreach (var site in server.Sites.Where(s => s.PublishProfile != null && string.IsNullOrEmpty(s.SiteCreationError)))
                    {
                        string contentTraceFileName = Helper.NewTempFile;
                        string dbTraceFileName      = Helper.NewTempFile;
                        site.PublishProfile.ContentTraceFile = contentTraceFileName;
                        site.PublishProfile.DbTraceFile      = dbTraceFileName;
                        var pubStatus = new PublishStatus(site.SiteName,
                                                          site.PublishProfile.DestinationAppUrl,
                                                          site.Databases != null && site.Databases.Count > 0,
                                                          contentTraceFileName,
                                                          dbTraceFileName);

                        MainForm.WriteTrace("Adding control to map for site: {0}", site.SiteName);
                        _publishControlMap[site.ServerName + site.SiteName] = pubStatus;
                        pubStatus.Dock = DockStyle.Top;
                        statusPanel.Controls.Add(pubStatus);
                    }

                    foreach (var site in server.Sites.Where(s => s.PublishProfile != null && !string.IsNullOrEmpty(s.SiteCreationError)))
                    {
                        PublishStatus pubStatus;
                        if (!_publishControlMap.TryGetValue(site.ServerName + site.SiteName, out pubStatus))
                        {
                            MainForm.WriteTrace("Adding control to map for site: {0} with site or db creation error", site.SiteName);
                            pubStatus = new PublishStatus(site.SiteName, site.SiteCreationError);
                            _publishControlMap[site.ServerName + site.SiteName] = pubStatus;
                            pubStatus.Dock = DockStyle.Top;
                            statusPanel.Controls.Add(pubStatus);
                        }
                    }
                }
            }

            _worker         = new BackgroundWorker();
            _worker.DoWork += (object doWorkSender, DoWorkEventArgs doWorkEventArgs) =>
            {
                PublishManager manager = new PublishManager();
                if (retry)
                {
                    foreach (var server in this.IISServers.Servers.Values)
                    {
                        foreach (var site in server.Sites.Where(s => (!s.ContentPublishState || !s.DbPublishState)))
                        {
                            if (!site.ContentPublishState)
                            {
                                MainForm.WriteTrace("Queuing operation for site: {0}", site.SiteName);
                                var operation = new PublishContentOperation(site, this);
                                manager.Enqueue(operation);
                            }

                            if (!site.DbPublishState)
                            {
                                MainForm.WriteTrace("Queing another operation for db for site: {0}", site.SiteName);
                                manager.Enqueue(new PublishDbOperation(site, this));
                            }
                        }
                    }
                }
                else
                {
                    foreach (var server in this.IISServers.Servers.Values)
                    {
                        foreach (var site in server.Sites.Where(s => s.PublishProfile != null && string.IsNullOrEmpty(s.SiteCreationError)))
                        {
                            MainForm.WriteTrace("Queuing operation for site: {0}", site.SiteName);
                            var operation = new PublishContentOperation(site, this);
                            manager.Enqueue(operation);
                            if (operation.HasDatabase)
                            {
                                MainForm.WriteTrace("Queing another operation for db for site: {0}", site.SiteName);
                                manager.Enqueue(new PublishDbOperation(site, this));
                            }
                        }
                    }
                }

                MainForm.WriteTrace("Calling start");
                manager.StartProcessing();
                MainForm.WriteTrace("Caling Wait");
                manager.WaitForOperations();
            };

            _worker.RunWorkerCompleted += (object runWorkerCompletedSender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs) =>
            {
                MainForm.WriteTrace("Wait complete. In worker completed");
                this.progressPictureBox.Visible = false;
                UpdateStatusLabel("Finished deploying");

                if (runWorkerCompletedEventArgs.Error != null)
                {
                    MainForm.WriteTrace("Worker thread has errors {0}", runWorkerCompletedEventArgs.Error.Message);
                    MessageBox.Show(runWorkerCompletedEventArgs.Error.Message);
                }

                bool hasPublishErrors      = false;
                bool hasSiteCreationErrors = false;
                foreach (var server in this.IISServers.Servers.Values)
                {
                    hasPublishErrors      |= server.Sites.Any(s => !s.ContentPublishState || !s.DbPublishState);
                    hasSiteCreationErrors |= server.Sites.Any(s => !string.IsNullOrEmpty(s.SiteCreationError));
                }

                this.feedbackButton.Text = "Send Error Report";
                if (!hasSiteCreationErrors && !hasPublishErrors)
                {
                    // all success show "Send feedback"
                    this.feedbackButton.Text = "Give Feedback";
                }

                this.btnRetry.Visible = this.btnRetry.Enabled = hasPublishErrors;

                this.feedbackButton.Visible = this.btnClose.Visible = true;
                if (!btnRetry.Visible)
                {
                    feedbackButton.Left = btnRetry.Left;
                }
            };

            _worker.RunWorkerAsync();
        }
        private void TryDeployment(bool retry)
        {
            if (!retry)
            {
                _publishControlMap.Clear();
                statusPanel.Controls.Clear();
            }

            this.lblStatus.Text = string.Empty;
            this.btnRetry.Visible = false;
            this.progressPictureBox.Visible = true;
            this.feedbackButton.Visible = false;
            this.btnClose.Visible = false;
            // Start local websites scan in a background thread.

            if (retry)
            {
                TraceHelper.Tracer.WriteTrace("Retrying ..");
                foreach (var server in this.IISServers.Servers.Values)
                {
                    foreach (var site in server.Sites.Where(s => (!s.ContentPublishState || !s.DbPublishState)))
                    {
                        PublishStatus pubStatus;
                        if (_publishControlMap.TryGetValue(site.ServerName + site.SiteName, out pubStatus))
                        {
                            if (!site.ContentPublishState)
                            {
                                pubStatus.ResetContentStatus();
                            }
                            else
                            {
                                pubStatus.ResetDbStatus();
                            }
                        }
                        else
                        {
                            TraceHelper.Tracer.WriteTrace("No control found for site: {0}", site.SiteName);
                        }
                    }
                }
            }
            else
            {
                foreach (var server in this.IISServers.Servers.Values)
                {
                    foreach (var site in server.Sites.Where(s => s.PublishProfile != null && string.IsNullOrEmpty(s.SiteCreationError)))
                    {
                        string contentTraceFileName = Helper.NewTempFile;
                        string dbTraceFileName = Helper.NewTempFile;
                        site.PublishProfile.ContentTraceFile = contentTraceFileName;
                        site.PublishProfile.DbTraceFile = dbTraceFileName;
                        var pubStatus = new PublishStatus(site.SiteName,
                            site.PublishProfile.DestinationAppUrl,
                            site.Databases != null && site.Databases.Count > 0,
                            contentTraceFileName,
                            dbTraceFileName);

                        TraceHelper.Tracer.WriteTrace("Adding control to map for site: {0}", site.SiteName);
                        _publishControlMap[site.ServerName + site.SiteName] = pubStatus;
                        pubStatus.Dock = DockStyle.Top;
                        statusPanel.Controls.Add(pubStatus);
                    }

                    foreach (var site in server.Sites.Where(s => s.PublishProfile != null && !string.IsNullOrEmpty(s.SiteCreationError)))
                    {
                        PublishStatus pubStatus;
                        if (!_publishControlMap.TryGetValue(site.ServerName + site.SiteName, out pubStatus))
                        {
                            TraceHelper.Tracer.WriteTrace("Adding control to map for site: {0} with site or db creation error", site.SiteName);
                            pubStatus = new PublishStatus(site.SiteName, site.SiteCreationError);
                            _publishControlMap[site.ServerName + site.SiteName] = pubStatus;
                            pubStatus.Dock = DockStyle.Top;
                            statusPanel.Controls.Add(pubStatus);
                        }
                    }
                }
            }

            _worker = new BackgroundWorker();
            _worker.DoWork += (object doWorkSender, DoWorkEventArgs doWorkEventArgs) =>
            {
                PublishManager manager = new PublishManager();
                if (retry)
                {
                    foreach (var server in this.IISServers.Servers.Values)
                    {
                        foreach (var site in server.Sites.Where(s => (!s.ContentPublishState || !s.DbPublishState)))
                        {
                            if (!site.ContentPublishState)
                            {
                                TraceHelper.Tracer.WriteTrace("Queuing operation for site: {0}", site.SiteName);
                                var operation = new PublishContentOperation(site, this);
                                manager.Enqueue(operation);
                            }

                            if (!site.DbPublishState)
                            {
                                TraceHelper.Tracer.WriteTrace("Queing another operation for db for site: {0}", site.SiteName);
                                manager.Enqueue(new PublishDbOperation(site, this));
                            }
                        }
                    }
                }
                else
                {
                    foreach (var server in this.IISServers.Servers.Values)
                    {
                        foreach (var site in server.Sites)
                        {
                            if (site.PublishProfile == null)
                            {
                                TraceHelper.Tracer.WriteTrace("ERROR: Skipping publish, no publish profile found for site: {0}", site.SiteName);
                                TraceHelper.Tracer.WriteTrace("HINT: Make sure that the publish profile element for the site contains the attribute" +
                                                              " originalsitename=\"{0}:{1}\" attribute", server.Name, site.SiteName);
                                TraceHelper.Tracer.WriteTrace("For more information see: https://www.movemetothecloud.net/Faq#toc12");
                                continue;
                            }

                            if (string.IsNullOrEmpty(site.SiteCreationError))
                            {
                                TraceHelper.Tracer.WriteTrace("ERROR: Skipping publish, site creation error for site: {0}", site.SiteName);
                                TraceHelper.Tracer.WriteTrace("Site creation error: {0}", site.SiteCreationError);
                                continue;
                            }

                            TraceHelper.Tracer.WriteTrace("Queuing operation for site: {0}", site.SiteName);
                            var operation = new PublishContentOperation(site, this);
                            manager.Enqueue(operation);
                            if (operation.HasDatabase)
                            {
                                TraceHelper.Tracer.WriteTrace("Queing another operation for db for site: {0}", site.SiteName);
                                manager.Enqueue(new PublishDbOperation(site, this));
                            }
                        }
                    }
                }

                TraceHelper.Tracer.WriteTrace("Calling start");
                manager.StartProcessing();
                TraceHelper.Tracer.WriteTrace("Caling Wait");
                manager.WaitForOperations();
            };

            _worker.RunWorkerCompleted += (object runWorkerCompletedSender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs) =>
            {
                TraceHelper.Tracer.WriteTrace("Wait complete. In worker completed");
                this.progressPictureBox.Visible = false;
                UpdateStatusLabel("Finished deploying");

                if (runWorkerCompletedEventArgs.Error != null)
                {
                    TraceHelper.Tracer.WriteTrace("Worker thread has errors {0}", runWorkerCompletedEventArgs.Error.Message);
                    MessageBox.Show(runWorkerCompletedEventArgs.Error.Message);
                }

                bool hasPublishErrors = false;
                bool hasSiteCreationErrors = false;
                foreach (var server in this.IISServers.Servers.Values)
                {
                    hasPublishErrors |= server.Sites.Any(s => !s.ContentPublishState || !s.DbPublishState);
                    hasSiteCreationErrors |= server.Sites.Any(s => !string.IsNullOrEmpty(s.SiteCreationError));
                }

                this.feedbackButton.Text = "Send Error Report";
                if (!hasSiteCreationErrors && !hasPublishErrors)
                {
                    // all success show "Send feedback"
                    this.feedbackButton.Text = "Give Feedback";
                }

                this.btnRetry.Visible = this.btnRetry.Enabled = hasPublishErrors;

                this.feedbackButton.Visible = this.btnClose.Visible = true;
                if (!btnRetry.Visible)
                {
                    feedbackButton.Left = btnRetry.Left;
                }
            };

            _worker.RunWorkerAsync();
        }