asp.net BackgroundWorker之在后台下载文件
asp.net BackgroundWorker之在后台下载文件
发布时间:2016-12-29 来源:查字典编辑
摘要:示例:下面的代码示例演示如何使用BackgroundWorker组件从URL加载XML文件。用户单击“下载”按钮时,Click事件处理程序将...

示例:

下面的代码示例演示如何使用 BackgroundWorker 组件从 URL 加载 XML 文件。用户单击“下载”按钮时,Click 事件处理程序将调用 BackgroundWorker 组件的 RunWorkerAsync 方法来启动下载操作。在下载过程中,将禁用该按钮,然后在下载完成后再启用该按钮。MessageBox 将显示文件的内容。

复制代码 代码如下:

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());

}

}

下载文件:

文件下载在 BackgroundWorker 组件的辅助线程上进行,该线程运行 DoWork 事件处理程序。当代码调用 RunWorkerAsync 方法时,将启动此线程。

复制代码 代码如下:

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);

}

等待 BackgroundWorker 完成

dowloadButton_Click 事件处理程序演示如何等待 BackgroundWorker 组件完成它的异步任务。使用 IsBusy 属性可以确定 BackgroundWorker 线程是否仍在运行。如果代码在主 UI 线程上(对于 Click 事件处理程序即是如此),请务必调用 Application.DoEvents 方法以使用户界面能够响应用户操作。

复制代码 代码如下:

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;

}

显示结果

backgroundWorker1_RunWorkerCompleted 方法将处理 RunWorkerCompleted 事件,并在后台操作完成后被调用。它首先检查 AsyncCompletedEventArgs.Error 属性,如果该属性是 null,它将显示文件内容。

复制代码 代码如下:

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 );

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类