Introduction
This is a simple user interface for downloading files via HTTP based on Phil Crosby's article located here.
Using the Code
The solution is located in the FileDownloader directory and contains two projects: one is the FileDownlaoder
UI library and the other is the WinForms test application. The code leaves much room for improvement, but as is usually the case in this field, the due date for my current project is yesterday; hence it's taken me so long to get a spare minute to post this! Here is how to instantiate the downloader:
DownloadURLCollection urls = new DownloadURLCollection();
urls.Add(new DownloadURL("http://www.codeproject.com/cs/internet/
CoolDownloader/CoolDownloader_demo.zip",
@"C:\Temp"));
urls.Add(new DownloadURL("http://releases.mozilla.org/pub/mozilla.org/
firefox/releases/1.5.0.6/win32/en-US/Firefox Setup 1.5.0.6.exe",
@"C:\Temp\newname.zip"));
FileDownloaderForm downloader = new FileDownloaderForm(urls);
downloader.ShowDialog();
That's it! No fuss, no muss. What happens under the hood is very well explained in Phil's article.
Points of Interest
Before the world of the BackgroundWorker
object in .NET 2.0, in order to get a multi-threaded application to interact with the user interface, you had to invoke the worker threads request on to the UI thread by hand:
private void downloader_ProgressChanged(object sender, DownloadEventArgs e)
{
try
{
this.Invoke(new MarshalProgress(this.MarshaledProgressChanged), new object[]{
sender, e});
}
catch(Exception ex)
{
DownloaderExceptionManager.Publish(ex);
}
}
When the progress event is fired, it's fired on a different thread. This is so while the file is downloading, the user interface window remains responsive. Before changing the value of the progress bar or the text of a label, the call must be marshaled to the UI thread by calling Invoke
on the control that exists on the UI thread, in this case, the FileDownloaderForm
. Thus, this.Invoke(...)
. In the invoke
method, you pass a delegate
, which is basically an object that can be thought of as a pointer to a function: it "points" to a specific function that conforms to the parameters described by the delegate
and returns the value described by the delegate
:
delegate void MarshalProgress(object sender, DownloadEventArgs e);
History
- First posted edition: 8/18/2006
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.