我们在设计Winform应用程序时,难免会遇到很多情况需要进行大量的运算,如果程序开始执行一个非常耗时的处理操作,在执行的过程中便会锁定用户界面,虽然程序一直在运行,单用户无法与程序之间进行交互,给用户的感觉好像整个程序已经卡死。这里,我介绍一种方法,通过使用BackgroundWorker组件创建一个相应的进度窗体来改善用户体验。
步骤一:
先在主程序中编写一个函数,用于模拟一个比较耗时的操作:
1: /// <summary>
2: /// 该函数用于模拟一个耗时的操作
3: /// </summary>
4: private void HeavyTask()
5: {
6: long lEnd = 99000000;
7: for (int i = 0; i < lEnd; i++)
8: {
9: double d = Math.Sqrt(Math.Log10(i) / Math.Pow(i, 2));
10: }
11: }
步骤二:
在主程序中添加一个模拟进度的窗体frmLoading。由于只涉及程序原理的设计,具体的进度条设置我就不多做介绍,可以使用委托来实现父窗体控制子窗体上的进度条。这里我引入一个Timer组件,让窗体上的Label根据时间来进行变动,以实现类似动画的效果,具体效果如下:
步骤三:
在主程序中添加一个Form类型的全局变量,并引入一个BackgroundWorker组件,编写相应按钮的单击事件处理函数和BackgroundWorker组件的相关事件函数,具体代码如下:
1: private void btnCalc_Click(object sender, EventArgs e)
2: {
3: bgw.RunWorkerAsync();
4:
5: m_frmLoading = new frmLoading();
6: m_frmLoading.ShowDialog();
7: }
8:
9: private void bgw_DoWork(object sender, DoWorkEventArgs e)
10: {
11: HeavyTask();
12: }
13:
14: private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
15: {
16: m_frmLoading.Close();
17: MessageBox.Show("任务完成!");
18: }
主程序界面如下:
程序启动,用户点击按钮,BackgroundWorker组件便会开启异步进行耗时的操作,程序显示模拟进度窗体,等BackgroundWorker组件完成工作后,便会关闭模拟进度窗体,并提示用户相关信息。