asp.net BackgroundWorker downloads files in the background

  • 2020-05-16 06:41:38
  • OfStack

Example:
The following code example demonstrates how to load the XML file from URL using the BackgroundWorker component. When the user clicks the download button, the Click event handler calls the RunWorkerAsync method of the BackgroundWorker component to initiate the download. The button is disabled during the download and then enabled after the download is complete. MessageBox displays the contents of the file.
 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Threading; 
using System.Windows.Forms; 
using System.Xml; 
public class Form1 : Form 
{ 
private BackgroundWorker backgroundWorker1; 
private Button dowloadButton; 
private XmlDocument document = null; 
public Form1() 
{ 
InitializeComponent(); 
} 
private void dowloadButton_Click(object sender, EventArgs e) 
{ 
// Start the download operation in the background. 
this.backgroundWorker1.RunWorkerAsync(); 
// Disable the button for the duration of the download. 
this.dowloadButton.Enabled = false; 
// Wait for the BackgroundWorker to finish the download. 
while (this.backgroundWorker1.IsBusy) 
{ 
// Keep UI messages moving, so the form remains 
// responsive during the asynchronous operation. 
Application.DoEvents(); 
} 
// The download is done, so enable the button. 
this.dowloadButton.Enabled = true; 
} 
private void backgroundWorker1_DoWork( 
object sender, 
DoWorkEventArgs e) 
{ 
document = new XmlDocument(); 
// Replace this file name with a valid file name. 
document.Load(@"http://www.tailspintoys.com/sample.xml"); 
// Uncomment the following line to 
// simulate a noticeable latency. 
//Thread.Sleep(5000); 
} 
private void backgroundWorker1_RunWorkerCompleted( 
object sender, 
RunWorkerCompletedEventArgs e) 
{ 
if (e.Error == null) 
{ 
MessageBox.Show(document.InnerXml, "Download Complete"); 
} 
else 
{ 
MessageBox.Show( 
"Failed to download file", 
"Download failed", 
MessageBoxButtons.OK, 
MessageBoxIcon.Error ); 
} 
} 
/// <summary> 
/// Required designer variable. 
/// </summary> 
private System.ComponentModel.IContainer components = null; 
/// <summary> 
/// Clean up any resources being used. 
/// </summary> 
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
protected override void Dispose(bool disposing) 
{ 
if (disposing && (components != null)) 
{ 
components.Dispose(); 
} 
base.Dispose(disposing); 
} 
#region Windows Form Designer generated code 
/// <summary> 
/// Required method for Designer support - do not modify 
/// the contents of this method with the code editor. 
/// </summary> 
private void InitializeComponent() 
{ 
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); 
this.dowloadButton = new System.Windows.Forms.Button(); 
this.SuspendLayout(); 
// 
// backgroundWorker1 
// 
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); 
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); 
// 
// dowloadButton 
// 
this.dowloadButton.Location = new System.Drawing.Point(12, 12); 
this.dowloadButton.Name = "dowloadButton"; 
this.dowloadButton.Size = new System.Drawing.Size(75, 23); 
this.dowloadButton.TabIndex = 0; 
this.dowloadButton.Text = "Download file"; 
this.dowloadButton.UseVisualStyleBackColor = true; 
this.dowloadButton.Click += new System.EventHandler(this.dowloadButton_Click); 
// 
// Form1 
// 
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
this.ClientSize = new System.Drawing.Size(104, 54); 
this.Controls.Add(this.dowloadButton); 
this.Name = "Form1"; 
this.Text = "Form1"; 
this.ResumeLayout(false); 
} 
#endregion 
} 
static class Program 
{ 
/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
Application.EnableVisualStyles(); 
Application.Run(new Form1()); 
} 
} 

Download file:
The file download takes place on the BackgroundWorker component's worker thread, which runs the DoWork event handler. This thread is started when the code calls the RunWorkerAsync method.
 
private void backgroundWorker1_DoWork( 
object sender, 
DoWorkEventArgs e) 
{ 
document = new XmlDocument(); 
// Replace this file name with a valid file name. 
document.Load(@"http://www.tailspintoys.com/sample.xml"); 
// Uncomment the following line to 
// simulate a noticeable latency. 
//Thread.Sleep(5000); 
} 

Wait for BackgroundWorker to complete
The dowloadButton_Click event handler demonstrates how to wait for the BackgroundWorker component to complete its asynchronous task. Use the IsBusy property to determine if the BackgroundWorker thread is still running. If your code is on the main UI thread (as it is for the Click event handler), be sure to call the Application.DoEvents method to enable the user interface to respond to user actions.
 
private void dowloadButton_Click(object sender, EventArgs e) 
{ 
// Start the download operation in the background. 
this.backgroundWorker1.RunWorkerAsync(); 
// Disable the button for the duration of the download. 
this.dowloadButton.Enabled = false; 
// Wait for the BackgroundWorker to finish the download. 
while (this.backgroundWorker1.IsBusy) 
{ 
// Keep UI messages moving, so the form remains 
// responsive during the asynchronous operation. 
Application.DoEvents(); 
} 
// The download is done, so enable the button. 
this.dowloadButton.Enabled = true; 
} 

According to the results
The backgroundWorker1_RunWorkerCompleted method handles the RunWorkerCompleted event and is called after the background operation is complete. It first checks the AsyncCompletedEventArgs.Error property, and if the property is null, it displays the file contents.
 
private void backgroundWorker1_RunWorkerCompleted( 
object sender, 
RunWorkerCompletedEventArgs e) 
{ 
if (e.Error == null) 
{ 
MessageBox.Show(document.InnerXml, "Download Complete"); 
} 
else 
{ 
MessageBox.Show( 
"Failed to download file", 
"Download failed", 
MessageBoxButtons.OK, 
MessageBoxIcon.Error ); 
} 
} 

Related articles: