Skip to content

Commit

Permalink
Remove unneeded thread protection. Convert from Thread to BackgroundW…
Browse files Browse the repository at this point in the history
…orker.
  • Loading branch information
StuffOfInterest committed Nov 15, 2016
1 parent e26af1a commit c8d5a66
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 69 deletions.
8 changes: 4 additions & 4 deletions NugetDependencyDownloader/MainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

116 changes: 51 additions & 65 deletions NugetDependencyDownloader/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,89 +11,80 @@ namespace NuGetDependencyDownloader
{
public partial class MainForm : Form
{
delegate void SetStopCallback();

private bool StopRequested { get { return !btnStop.Enabled; } }
BackgroundWorker _worker;

public MainForm()
{
InitializeComponent();
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (_worker != null && _worker.IsBusy)
{
_worker.CancelAsync();
}
}

private void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false;
btnStop.Enabled = true;

LaunchThread();
StartWork();
}

private void btnStop_Click(object sender, EventArgs e)
{
EndWork();
}
private void btnStop_EnabledChanged(object sender, EventArgs e)
{
if (btnStop.Enabled == false)
{
btnStart.Enabled = true;
}
btnStop.Enabled = false;
_worker.CancelAsync();
}

private void LaunchThread()
private void StartWork()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
worker.RunWorkerAsync();
}

void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
ProcessPackage();
_worker = new BackgroundWorker
{
WorkerSupportsCancellation = true,
WorkerReportsProgress = true
};
_worker.DoWork += new DoWorkEventHandler(DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(EndWork);
_worker.ProgressChanged += new ProgressChangedEventHandler(Progress);
_worker.RunWorkerAsync();
}

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
void Progress(object sender, ProgressChangedEventArgs e)
{
EndWork();
ShowActivity((string)e.UserState);
}

private void EndWork()
void EndWork(object sender, RunWorkerCompletedEventArgs e)
{
// Shut off stop button in a thread safe way
if (btnStop.InvokeRequired)
{
SetStopCallback d = new SetStopCallback(EndWork);
Invoke(d, new object[] { });
}
else
{
btnStop.Enabled = false;
btnStart.Enabled = true;
}
btnStop.Enabled = false;
btnStart.Enabled = true;
}

private void ProcessPackage()
void DoWork(object sender, DoWorkEventArgs e)
{
CollectPackages();

if (StopRequested)
if (_worker.CancellationPending)
{
ShowConsole("Stopped.");
_worker.ReportProgress(0, "Stopped.");
return;
}

ShowConsole(string.Format("{0} packages to download.", Utility.Packages.Count));
_worker.ReportProgress(0, string.Format("{0} packages to download.", Utility.Packages.Count));

DownloadPackages();

if (StopRequested)
if (_worker.CancellationPending)
{
ShowConsole("Stopped.");
_worker.ReportProgress(0, "Stopped.");
return;
}

ShowConsole("Done.");
_worker.ReportProgress(0, "Done.");
}

private void CollectPackages()
Expand All @@ -115,12 +106,12 @@ private void CollectPackages()

if (package == null)
{
ShowConsole("Package not found.");
_worker.ReportProgress(0, "Package not found.");
return;
}

Utility.Packages.Add(package);
ShowConsole(package.GetFullName());
_worker.ReportProgress(0, package.GetFullName());
LoadDependencies(package);
}

Expand All @@ -134,12 +125,12 @@ private void LoadDependencies(IPackage package)

foreach (var dependency in dependencies)
{
if (StopRequested)
if (_worker.CancellationPending)
return;

IQueryable<IPackage> packages = Utility.GetPackages(dependency.Id, checkBoxPrerelease.Checked);
IPackage depPackage = Utility.GetRangedPackageVersion(packages, dependency.VersionSpec);
ShowConsole(string.Format("{0} -> {1}", package.GetFullName(), depPackage.GetFullName()));
_worker.ReportProgress(0, string.Format("{0} -> {1}", package.GetFullName(), depPackage.GetFullName()));

if (!Utility.IsPackageKnown(depPackage))
{
Expand All @@ -157,17 +148,17 @@ private void DownloadPackages()

foreach (var package in Utility.Packages)
{
if (StopRequested)
if (_worker.CancellationPending)
return;

string fileName = string.Format("{0}.{1}.nupkg", package.Id.ToLower(), package.Version);
if (File.Exists("download\\" + fileName))
{
ShowConsole(string.Format("{0} already downloaded.", fileName));
_worker.ReportProgress(0, string.Format("{0} already downloaded.", fileName));
continue;
}

ShowConsole(string.Format("downloading {0}", fileName));
_worker.ReportProgress(0, string.Format("downloading {0}", fileName));
using (var client = new WebClient())
{
var dsp = (DataServicePackage)package;
Expand All @@ -178,27 +169,22 @@ private void DownloadPackages()

SlidingBuffer<string> _consoleBuffer = new SlidingBuffer<string>(1000);

private void ShowConsole(string text)
private void ShowActivity(string text)
{
Invoke(new MethodInvoker(
delegate
{
_consoleBuffer.Add(text);

textBoxActivity.Lines = _consoleBuffer.ToArray();
textBoxActivity.Focus();
textBoxActivity.SelectionStart = textBoxActivity.Text.Length;
textBoxActivity.SelectionLength = 0;
textBoxActivity.ScrollToCaret();
textBoxActivity.Refresh();
}
));
_consoleBuffer.Add(text);

textBoxActivity.Lines = _consoleBuffer.ToArray();
textBoxActivity.Focus();
textBoxActivity.SelectionStart = textBoxActivity.Text.Length;
textBoxActivity.SelectionLength = 0;
textBoxActivity.ScrollToCaret();
textBoxActivity.Refresh();
}

private class Dependency
{
public string Id { get; set; }
public IVersionSpec VersionSpec { get; set; }
}
}
}
}

0 comments on commit c8d5a66

Please sign in to comment.