public void ShowProgressForm(Action Start = null, Action Complete = null)
        {
            var ProgressForm = new ProgressForm();

            ProgressForm.WaitObject = this.IsFinishedLockObject;

            this.OnStep += delegate(double Value, String Details)
            {
                ProgressForm.SetStep(Value, Details);
            };

            ProgressForm.SetOriginDestination(
                SourceFileSystem.Title,
                DestinationFileSystem.Title
                );

            this.OnError += delegate(Exception Exception)
            {
                if (!Canceling)
                {
                    MessageBox.Show(Exception.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            };

            ProgressForm.OnCancelClick = delegate()
            {
                return(MessageBox.Show("¿Está seguro de querer cancelar la sincronización?", "Atención", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == System.Windows.Forms.DialogResult.Yes);
            };

            if (Complete != null)
            {
                ProgressForm.Complete += Complete;
            }

            ProgressForm.Process = delegate()
            {
RetrySource:

                try
                {
                    CallStep(0, String.Format(ConnectingToFormat, SourceFileSystem.Title));
                    SourceFileSystem.TryInitialize();
                }
                catch (Exception Exception)
                {
                    Console.WriteLine(Exception);
                    if (!Canceling)
                    {
                        if (MessageBox.Show(Exception.Message + "\n\n" + Exception.StackTrace, "Can't connect to local FileSystem", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2) == DialogResult.Retry)
                        {
                            goto RetrySource;
                        }
                    }
                }

RetryDestination:

                try
                {
                    CallStep(0, String.Format(ConnectingToFormat, DestinationFileSystem.Title));
                    DestinationFileSystem.TryInitialize();
                }
                catch (Exception Exception)
                {
                    Console.WriteLine(Exception);
                    if (!Canceling)
                    {
                        if (MessageBox.Show(Exception.Message + "\n\n" + Exception.StackTrace, "Can't connect to remote FileSystem", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2) == DialogResult.Retry)
                        {
                            goto RetryDestination;
                        }
                    }
                }

                Console.WriteLine("Started SynchronizeFolder ({0} -> {1})...", SourceFileSystem, DestinationFileSystem);
                this.SynchronizeFolder();
            };

            ProgressForm.Cancel = this.Cancel;

            if (Start != null)
            {
                Start();
            }

            //ProgressForm.ShowDialog();
            ProgressForm.ExecuteProcess();
        }