在C#中创建进度窗体

时间:2022-08-30 17:46:48

我们在设计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根据时间来进行变动,以实现类似动画的效果,具体效果如下:

在C#中创建进度窗体在C#中创建进度窗体在C#中创建进度窗体在C#中创建进度窗体

 

步骤三:

在主程序中添加一个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:          }

 

主程序界面如下:

在C#中创建进度窗体

 

程序启动,用户点击按钮,BackgroundWorker组件便会开启异步进行耗时的操作,程序显示模拟进度窗体,等BackgroundWorker组件完成工作后,便会关闭模拟进度窗体,并提示用户相关信息。