private void SaveWorkerHost_DoWork(object sender, DoWorkEventArgs e)
        {
            Logger.Info("Started");

            var statusChangedEventArgs = new DoWorkEventArgs(null);
            e.Result = "Starting...";
            StatusChanged(sender, statusChangedEventArgs);

            ActivePublishWorkers.Clear();

            foreach (var publishWorker in CompletedPublishWorkers)
            {
                publishWorker.Dispose();
            }
            CompletedPublishWorkers.Clear();

            //totalSecondsOfOutput = CalculateTotalSecondsOfOutput();
            totalProgressUnits = CalculateTotalProgressUnits();

            foreach (var highlightObject in MainModel.HighlightObjects)
            {
                if (CancellationPending)
                    break;

                if (highlightObject.SaveToDisk)
                {
                    var saveWorker = new SaveWorker(highlightObject);
                    saveWorker.StatusChanged += publishWorker_StatusChanged;
                    saveWorker.ProgressChanged += publishWorker_ProgressChanged;
                    RunWorker(saveWorker); // runs syncronously
                }

                if (highlightObject.ShareToFacebook)
                {
                    var facebookShareWorker = new FacebookShareWorker(highlightObject);
                    facebookShareWorker.StatusChanged += publishWorker_StatusChanged;
                    facebookShareWorker.ProgressChanged += publishWorker_ProgressChanged;
                    RunWorker(facebookShareWorker); // runs syncronously
                }

            }

            // wait for ActiveScanWorkers to clean up

            IsCancelled = CancellationPending; // we use this instead of e.Cancel because if we set e.Cancel, we can't read e.Result (http://bytes.com/topic/c-sharp/answers/519073-asynch-crash-when-e-cancel-set)
            e.Result = CompletedPublishWorkers;
        }