zoukankan      html  css  js  c++  java
  • 批量处理任务进度条控制—基于BackgroundWorker

          今天要做一个批量处理图层数据的功能,希望在处理任务过程中,各个任务都能在进度条中显示自己的当前进度,决定继续使用强大易用的BackgroundWorker组件。通过在RunWorkerCompleted事件中进行控制来达到各任务独立显示完成进度的目标。测试在之前的介绍BackgroundWork功能的测试代码基础上展开,测试例子截图如下:

                                                      

    分别向每个ListBox中写入1-100000的数字,向每个Listbox中写入过程中,进度条都自左向右走一遍,直到3个ListBox写入数字任务全部完成。代码如下:

     1  public partial class Form1 : Form
     2     {
     3         List<ListBox> m_NumberBoxList = new List<ListBox>();//存放ListBox
     4         ListBox m_CurrentListBox = null;//当前写入Items的ListBox
     5         int m_CurrentListBoxIndex = 0;//当前写入Items的ListBox的索引
     6         public Form1()
     7         {
     8             InitializeComponent();
     9 
    10             backgroundWorker1.WorkerReportsProgress = true;//报告完成进度 
    11             backgroundWorker1.WorkerSupportsCancellation = true;//允许用户终止后台线程 
    12             backgroundWorker1.DoWork += new DoWorkEventHandler(ListNumber);
    13 
    14             m_NumberBoxList.Add(listBox1);
    15             m_NumberBoxList.Add(listBox2);
    16             m_NumberBoxList.Add(listBox3);
    17         }
    18 
    19         private void btnOk_Click(object sender, EventArgs e)
    20         {
    21             //向第一个ListBox写入数值
    22             m_CurrentListBox = m_NumberBoxList[0];
    23             if (!backgroundWorker1.IsBusy)//判断backgroundWorker1是否正在运行异步操作 
    24             {
    25                 backgroundWorker1.RunWorkerAsync(100000);//开始执行后台操作 
    26             } 
    27         }
    28 
    29         void ListNumber(object sender, DoWorkEventArgs e)
    30         {
    31             int num = (int)e.Argument;//接收传入的参数 
    32             for (int i = 1; i <= num; i++)
    33             {
    34                 if (backgroundWorker1.CancellationPending)//判断是否请求了取消后台操作 
    35                 {
    36                     e.Cancel = true;
    37                     return ;
    38                 }
    39                 backgroundWorker1.ReportProgress(i * 100 / num, i);//报告完成进度 
    40                 System.Threading.Thread.Sleep(0);//后台线程交出时间片 
    41             }
    42         }
    43 
    44         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    45         {
    46             progressBar1.Value = e.ProgressPercentage;//将完成进度数据传给进度条 
    47             m_CurrentListBox.Items.Add(e.UserState);//将中间计算结果在ListBox控件中显示出来 
    48             m_CurrentListBox.Update();//刷新ListBox
    49         }
    50 
    51         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    52         {
    53             progressBar1.Value = 0;
    54             m_CurrentListBoxIndex++;
    55 
    56             if(m_CurrentListBoxIndex!=m_NumberBoxList.Count)
    57             {
    58                 m_CurrentListBox = m_NumberBoxList[m_CurrentListBoxIndex];
    59                 if (!backgroundWorker1.IsBusy)//判断backgroundWorker1是否正在运行异步操作 
    60                 { 
    61                     backgroundWorker1.RunWorkerAsync(100000);//开始执行后台操作 
    62                 } 
    63             }
    64             else 
    65             {
    66                 m_CurrentListBoxIndex = 0;
    67                 MessageBox.Show("处理完成!");
    68             }
    69         }
    70 
    71         private void btnStop_Click(object sender, EventArgs e)
    72         {
    73             if (backgroundWorker1.WorkerSupportsCancellation == true)
    74             {
    75                 backgroundWorker1.CancelAsync();//取消后台操作 
    76                 backgroundWorker1.Dispose();//释放资源 
    77             }
    78         }
    79     }
    View Code

    运行过程截图如下:

     

  • 相关阅读:
    EOJ月赛-OLED【二维前缀和】
    牛客多校3-Operating on a Graph【dsu】
    牛客多校1——1or2
    牛客多校1——Minimum-cost Flow
    牛客多校2-Cover the tree
    P4304 [TJOI2013]攻击装置 【网络流】
    yesky wine供应系统题解【二分图匹配】
    P3355 骑士共存问题【最小点覆盖】【网络流24题】
    事件委托
    Javascript9张思维导图
  • 原文地址:https://www.cnblogs.com/RoyYu/p/3382263.html
Copyright © 2011-2022 走看看