c# BackgroundWorker使用方法攻略
背景介绍
使用C#编写程序时,如果需要完成一些比较费时的操作,例如读写文件、网络传输等,这些操作会阻塞UI线程,使得UI无响应,影响用户体验。因此,我们需要使用多线程来完成这些操作,使得UI线程不受阻塞,从而保证程序的流畅性和高效性。
而在多线程编程中,我们经常会使用C#自带的BackgroundWorker组件,它是一个轻量级的线程组件,可以方便地实现异步操作。
使用方法
创建BackgroundWorker
我们首先需要创建一个BackgroundWorker对象。使用命名空间System.ComponentModel
,通过New关键字创建:
BackgroundWorker worker = new BackgroundWorker();
设置BackgroundWorker属性
我们需要设置BackgroundWorker的一些属性,来定义它的行为:
- WorkerReportsProgress:设置是否支持进度报告。
- WorkerSupportsCancellation:设置是否支持取消异步任务。
- DoWork事件:使用此事件处理异步任务的主要逻辑。
- ProgressChanged事件:使用此事件处理异步任务的进度记录和更新UI。
- RunWorkerCompleted事件:使用此事件处理异步任务完成后的清理工作和更新UI。
示例代码:
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(DoWork_Handler);
worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged_Handler);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted_Handler);
编写异步任务逻辑
我们需要在DoWork
事件中实现异步任务的逻辑。由于它是在异步线程中运行的,你需要考虑到线程安全。
示例1: 使用BackgroundWorker下载文件
private void DoWork_Handler(object sender, DoWorkEventArgs e)
{
string url = e.Argument as string;
WebClient client = new WebClient();
Stream stream = client.OpenRead(url);
FileStream file = new FileStream("file.txt", FileMode.Create);
byte[] buffer = new byte[1024];
int len = 0;
int count = 0;
while ((len = stream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, len);
count += len;
int percentage = (int)((double)count / stream.Length * 100);
(sender as BackgroundWorker).ReportProgress(percentage);
if ((sender as BackgroundWorker).CancellationPending)
{
e.Cancel = true;
file.Close();
stream.Close();
return;
}
}
file.Close();
stream.Close();
}
示例2: 使用BackgroundWorker计算数列
private void DoWork_Handler(object sender, DoWorkEventArgs e)
{
int n = (int)e.Argument;
int[] array = new int[n];
array[0] = 0;
array[1] = 1;
for (int i = 2; i < n; i++)
{
array[i] = array[i - 1] + array[i - 2];
int percentage = (int)((double)i / n * 100);
(sender as BackgroundWorker).ReportProgress(percentage);
if ((sender as BackgroundWorker).CancellationPending)
{
e.Cancel = true;
return;
}
}
e.Result = array;
}
处理异步任务事件
我们需要实现异步任务事件处理程序来处理异步任务的逻辑和UI更新。
- 在
ProgressChanged
事件中更新进度条、进度文本等UI控件的值。 - 在
RunWorkerCompleted
事件中处理异步任务完成后的清理工作,例如启用UI控件等操作。
示例代码:
private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs e)
{
// 更新进度条和进度文本等UI控件的值
progressBar.Value = e.ProgressPercentage;
progressText.Text = $"{e.ProgressPercentage}%";
}
private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("异步任务已取消");
}
else if (e.Error != null)
{
MessageBox.Show("异步任务发生异常:" + e.Error.Message);
}
else
{
// 处理异步任务完成后的逻辑
MessageBox.Show("异步任务已完成!");
}
}
执行异步任务
在执行异步任务前,我们可以调用BackgroundWorker.ReportProgress
主动触发ProgressChanged
事件更新UI界面。在后台线程中执行BackgroundWorker.RunWorkerAsync
方法启动异步任务。如果需要取消异步任务,可以在主线程中调用BackgroundWorker.CancelAsync
方法。
示例代码:
private void downloadButton_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(urlTextbox.Text))
{
worker.RunWorkerAsync(urlTextbox.Text);
}
}
private void cancelButton_Click(object sender, EventArgs e)
{
worker.CancelAsync();
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("异步任务已取消");
}
else if (e.Error != null)
{
MessageBox.Show("异步任务发生异常:" + e.Error.Message);
}
else
{
MessageBox.Show("异步任务已完成!");
}
progressBar.Value = 0;
progressText.Text = "0%";
}
总结
通过使用BackgroundWorker组件,我们可以轻松实现程序中的异步操作,保证程序的流畅性和高效性。在使用过程中,需要注意线程安全和UI更新等问题,以确保程序运行的可靠性和稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# BackgroundWorker使用方法 - Python技术站