public void queueWorker_DoWork(object sender, DoWorkEventArgs e) { Server server = (Server)e.Argument; Queue <QueueItem> ps4PkgQueue = new Queue <QueueItem>(); ps4PkgList.Where(pkg => pkg.TaskType == Enums.TaskType.Queued).ToList().ForEach(p => ps4PkgQueue.Enqueue(p)); int totalQueue = ps4PkgQueue.Count; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (ps4PkgQueue.Count > 0) { this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"Items left in queue {ps4PkgQueue.Count} of {totalQueue}"); var queueItem = ps4PkgQueue.Dequeue(); try { bool checkedPrereqs = false; PkgTransfer pkgTransfer = new PkgTransfer(queueItem, queueBackgroundWorker, fileRenameService, server); while (!queueBackgroundWorker.CancellationPending) { if (!checkedPrereqs) { if (SanitizePathNeeded(queueItem.PkgInfo, out var renameInfo)) { queueItem.FileRenameInfo = renameInfo; if (!fileRenameService.Rename(renameInfo)) { throw new SkipItemException(Enums.TaskType.Failed, "Failed to sanitize file. Rename this file manually and re-add to the sender."); } queueItem.PkgInfo.FilePath = renameInfo.CurrentPath; } checkedPrereqs = true; } if (!server.IsRunning) { server.StartServer(queueItem.PkgInfo); } var transferProgress = pkgTransfer.Transfer(); if (transferProgress.TimeLeft > 0) { this.progressBar1.InvokeIfRequired(() => progressBar1.ExtraText = $" ({transferProgress.TimeLeft})"); } if (transferProgress.TransferStatus == Enums.TransferStatus.Completed) { progressBar1.InvokeIfRequired(() => progressBar1.ResetProgressBar()); queueItem.UpdateTask(Enums.TaskType.Finished, queueItem.Uninstall ? "Uninstalled" : "Installed", listViewItemsQueue); server.StopServer(); System.Threading.Thread.Sleep(1000); //Sleep some seconds so we don't piss the server off break; } System.Threading.Thread.Sleep(500); } } catch (SkipItemException ex) { //Skip Item queueItem.UpdateTask(ex.TaskType, ex.Message, listViewItemsQueue); server.StopServer(); }catch (ServerInitializationException ex) { queueItem.UpdateTask(Enums.TaskType.Failed, $"Failed to initialize server - {ex.Message}", listViewItemsQueue); } if (queueItem.FileRenameInfo != null) { //Queue the file to the service, so we can rename it to the old filename fileRenameService.FileRenameQueue.Enqueue(queueItem.FileRenameInfo); } } if (!queueBackgroundWorker.CancellationPending) { this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"All Done!"); this.InvokeIfRequired(() => buttonProcessQueue_Click(null, null)); } else { this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"Items left in queue {ps4PkgQueue.Count} of {totalQueue}"); } server.StopServer(); connected = false; }