public static DialogResult process(
     IndefiniteProcessor indefiniteProcessor,
     String titleText,
     IWin32Window ownerWindow
     )
 {
     using (IndefiniteProcessingForm indefiniteProcessingForm = new IndefiniteProcessingForm(indefiniteProcessor, titleText)) {
         return(indefiniteProcessingForm.ShowDialog(ownerWindow));
     }
 }
        private IndefiniteProcessingForm(IndefiniteProcessor indefiniteProcessor, String titleText)
        {
            this.indefiniteProcessor = indefiniteProcessor;

            Text            = titleText;
            StartPosition   = FormStartPosition.CenterParent;
            ClientSize      = new Size(600, 500);
            FormBorderStyle = FormBorderStyle.FixedDialog;
            ShowInTaskbar   = false;

            this.appendControls(
                logTextBox = new TextBox()
            {
                ReadOnly = true, Multiline = true, ScrollBars = ScrollBars.Both, WordWrap = false, Dock = DockStyle.Fill
            },
                progressBar = new ProgressBar()
            {
                Step = 1, Dock = DockStyle.Bottom, Style = ProgressBarStyle.Marquee, MarqueeAnimationSpeed = 30
            },
                new Panel()
            {
                Dock = DockStyle.Bottom, Height = 30, Padding = new Padding(4)
            }.withControls(
                    new Button()
            {
                Text = "Stop", Dock = DockStyle.Right, TabIndex = 1
            }.withAction(stop)
                    )
                );

            logTextBoxWriter = new TextBoxWriter(logTextBox);

            backgroundWorker = new BackgroundWorker()
                               .withCancellationSupport()
                               .withWork <Object, Object, BackgroundWorker>(doWork)
                               .whenCompleted(onBackgroundWorkerRunWorkerCompleted);
        }