下面是“C#中BackgroundWorker的使用教程”的完整攻略。
背景
BackgroundWorker
是C#中常用于执行后台任务的组件,它可以执行不会阻塞UI线程的耗时操作,并在操作完成后返回结果。这个组件非常适合处理长时间运行的操作,例如读取、写入文件或进行网络通信等。
BackgroundWorker的基本用法
实例化BackgroundWorker组件
首先,需要在代码中实例化BackgroundWorker
组件。在Visual Studio中,可以通过拖放控件或直接在代码中实例化组件。下面是在代码中实例化的示例代码:
using System.ComponentModel;
namespace MyApplication
{
public partial class MainForm : Form
{
private BackgroundWorker worker;
public MainForm()
{
InitializeComponent();
worker = new BackgroundWorker();
}
}
}
可以看出,在MainForm
的构造函数中创建了一个BackgroundWorker
实例并将其存储在worker
变量中。
设置BackgroundWorker的属性
在BackgroundWorker
实例创建后,需要设置其属性,以便该组件能够执行后台操作并返回结果。
下面是一些常用的属性:
WorkerReportsProgress
:指示BackgroundWorker
是否支持报告进度。WorkerSupportsCancellation
:指示BackgroundWorker
是否支持取消操作。DoWork
:定义BackgroundWorker
需要执行的操作。ProgressChanged
:定义进度更新时触发的事件。RunWorkerCompleted
:定义操作完成时触发的事件。
在Visual Studio中,可以通过组件属性窗口或代码中调用属性设置来设置这些属性。下面是一个代码段,设置了BackgroundWorker
的这些属性:
public MainForm()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
}
这个示例代码中设置了上述所有属性,并将它们分别绑定到处理函数中。
执行BackgroundWorker
在设置好BackgroundWorker
的属性之后,可以通过调用BackgroundWorker.RunWorkerAsync()
方法来执行后台操作。下面是具体实现:
private void StartButton_Click(object sender, EventArgs e)
{
if (!worker.IsBusy)
{
worker.RunWorkerAsync();
}
}
在StartButton按钮的单击事件处理程序中,调用BackgroundWorker.RunWorkerAsync()
方法来启动后台操作。可以通过检查BackgroundWorker.IsBusy
属性来判断后台操作是否正在运行。
处理BackgroundWorker的结果
当BackgroundWorker
完成操作时,将引发RunWorkerCompleted
事件。可以在事件处理程序中处理操作的结果。以下是一个示例:
private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show($"Error occurred: {e.Error.Message}");
}
else if (e.Cancelled)
{
MessageBox.Show("Operation cancelled.");
}
else
{
MessageBox.Show("Operation completed successfully.");
}
}
在CompletedHandler
事件处理程序中,检查RunWorkerCompletedEventArgs
参数中的Error
和Cancelled
属性,以确定操作是否完成,并处理结果。
示例1:执行计算任务
下面是一个简单的示例,演示如何使用BackgroundWorker
执行计算任务,并报告进度和处理结果。
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace MyApplication
{
public partial class MainForm : Form
{
private BackgroundWorker worker;
public MainForm()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
}
private void DoWorkHandler(object sender, DoWorkEventArgs e)
{
int num = (int)e.Argument;
int result = 0;
for (int i = 1; i <= num; i++)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
result += i;
int progress = (i * 100) / num;
worker.ReportProgress(progress);
Thread.Sleep(100);
}
e.Result = result;
}
private void ProgressChangedHandler(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show($"Error occurred: {e.Error.Message}");
}
else if (e.Cancelled)
{
MessageBox.Show("Operation cancelled.");
}
else
{
int result = (int)e.Result;
resultLabel.Text = result.ToString();
}
startButton.Enabled = true;
}
private void StartButton_Click(object sender, EventArgs e)
{
if (!worker.IsBusy)
{
int num = (int)numUpDown.Value;
startButton.Enabled = false;
worker.RunWorkerAsync(num);
}
}
private void CancelButton_Click(object sender, EventArgs e)
{
if (worker.IsBusy)
{
worker.CancelAsync();
}
}
}
}
上述代码创建一个窗体,在窗体中有一个数字输入框、一个进度条、一个计算按钮和一个取消按钮。当用户点击计算按钮时,将在后台线程中计算1到输入数字之间的所有数字之和,并报告进度。当计算完成时,将在UI线程上更新结果标签。当用户点击取消按钮时,将取消计算任务。
示例2:异步读取文件
下面是另一个示例,说明如何使用BackgroundWorker
异步读取文件。
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;
namespace MyApplication
{
public partial class MainForm : Form
{
private BackgroundWorker worker;
public MainForm()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
}
private void DoWorkHandler(object sender, DoWorkEventArgs e)
{
string filename = (string)e.Argument;
StreamReader reader = new StreamReader(filename);
string text = reader.ReadToEnd();
e.Result = text;
}
private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show($"Error occurred: {e.Error.Message}");
}
else
{
string text = (string)e.Result;
textBox.Text = text;
}
openButton.Enabled = true;
}
private void OpenButton_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filename = openFileDialog.FileName;
openButton.Enabled = false;
worker.RunWorkerAsync(filename);
}
}
}
}
该示例创建一个窗体,该窗体包含一个读取文件按钮和一个文本框。当用户单击读取文件按钮时,将弹出文件对话框,用户可以选择一个文本文件。BackgroundWorker
将在后台线程中读取该文件,并将读取的文本返回到UI线程用于更新文本框。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中backgroundworker的使用教程 - Python技术站