下面我将为您详细讲解 “WinForm中BackgroundWorker控件用法简单实例”的攻略。
背景介绍
BackgroundWorker
控件是一个可将耗时操作异步在后台运行的控件,它是一个轻量级的多线程组件,采用消息机制处理异步耗时操作完成后的回调。使用 BackgroundWorker
可以避免 UI
界面假死或者卡顿的情况,提升程序的用户体验。
示例说明
示例1:使用 BackgroundWorker
控件实现后台计算
我们先设计一个 WinForm
界面,包含一个 TextBox
用于输入数字,一个 Button
用于触发计算,一个 Label
用于显示运算结果:
private void btnCalculate_Click(object sender, EventArgs e)
{
if (int.TryParse(txtInput.Text, out int input))
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Worker_DoWork;
worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
worker.RunWorkerAsync(input);
}
else
{
lblResult.Text = "请输入正确的数字";
lblResult.ForeColor = Color.Red;
}
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
int input = (int)e.Argument;
int result = Calculate(input); //计算函数
e.Result = result;
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
int result = (int)e.Result;
lblResult.Text = result.ToString();
lblResult.ForeColor = Color.Green;
}
private int Calculate(int input)
{
//模拟一个计算任务
Thread.Sleep(3000);
return input * input;
}
在按钮点击事件中,通过 BackgroundWorker
控件实例化一个后台线程,然后分别为它的 DoWork
和 RunWorkerCompleted
事件指定响应函数。在 DoWork
事件中,我们将计算函数 Calculate
在后台线程中执行,并将计算结果存储在 e.Result
中。在 RunWorkerCompleted
事件中,我们拿到计算结果,并在 Label
控件中将结果显示出来。
示例2:使用 BackgroundWorker
控件更新 ProgressBar
控件
我们继续在上面的界面中加入一个 ProgressBar
控件,用于表示计算任务的进度,同时修改 Calculate
函数,采用模拟任务进度的方式,每隔 0.5 秒更新一次进度。
private void btnCalculate_Click(object sender, EventArgs e)
{
if (int.TryParse(txtInput.Text, out int input))
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true; //开启进度报告
worker.DoWork += Worker_DoWork1;
worker.ProgressChanged += Worker_ProgressChanged1; //处理进度变化事件
worker.RunWorkerCompleted += Worker_RunWorkerCompleted1;
worker.RunWorkerAsync(input);
}
else
{
lblResult.Text = "请输入正确的数字";
lblResult.ForeColor = Color.Red;
}
}
private void Worker_DoWork1(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
int input = (int)e.Argument;
int result = 0;
for (int i = 1; i <= input; i++)
{
result += i;
Thread.Sleep(500);
worker.ReportProgress(i * 100 / input); //触发进度变化事件
}
e.Result = result;
}
private void Worker_ProgressChanged1(object sender, ProgressChangedEventArgs e)
{
pbProgress.Value = e.ProgressPercentage; //更新进度条
}
private void Worker_RunWorkerCompleted1(object sender, RunWorkerCompletedEventArgs e)
{
int result = (int)e.Result;
lblResult.Text = result.ToString();
lblResult.ForeColor = Color.Green;
}
在这个示例中,我们在 BackgroundWorker
控件创建时开启进度报告,然后在 DoWork
事件中对 Calculate
函数进行一个简单的修改:每隔 0.5 秒即可更新一次进度。在 DoWork
事件中,我们调用 ReportProgress
方法来触发进度变化事件,将当前的进度百分比传递进去,然后在 ProgressChanged
事件中更新 ProgressBar
控件的值即可。
总结
以上就是 WinForm
中 BackgroundWorker
控件的一个简单使用攻略。BackgroundWorker
控件的强大之处在于它可以很方便地完成多线程编程,使得我们能够更好地提升程序的性能和用户体验,同时它的使用也极为简单,只需要几个事件和方法即可完成一个异步操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WinForm中BackgroundWorker控件用法简单实例 - Python技术站