zoukankan      html  css  js  c++  java
  • C#.NET中使用BackgroundWorker在模态对话框中显示进度条

    这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条。

      首先是主窗体代码:

     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace ModalProgressDialog
    {
        public partial class Form1 : Form
        {
            protected BackgroundWorker worker = new BackgroundWorker();
            protected Form2 frm = new Form2();
    
            public Form1()
            {
                worker.DoWork += new DoWorkEventHandler(worker_DoWork);
                worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                worker.WorkerReportsProgress = true;            
                worker.RunWorkerAsync();
                frm.ShowDialog();
            }
    
            void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                frm.Close();
                MessageBox.Show("Done");
            }
    
            void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                frm.ProgressValue = e.ProgressPercentage;
            }
    
            void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                CountTheTime();
            }
    
            private void CountTheTime()
            {
                int initialValue = 100; 
                for (int count = 0; count < initialValue; count = count + 2) 
                { 
                    Thread.Sleep(1000);
                    worker.ReportProgress(count); 
                }
            }
        }
    }

    主窗体中只有一个按钮,当被点击时,会由BackgroundWorker对象以异步的方式去执行一个假象的后台操作CountTheTime方法。CountTheTime方法从0到100以步长为2每隔1秒更新一下进度条状态,因此这个假象的后台操作大约会持续50秒左右的时间。当程序执行时,进度条指示窗口以模态对话框的形式被弹出,然后实时显示后台操作的进度。

      BackgroundWorker对象有三个主要的事件:

      DoWork - 当BackgroundWorker对象的多线程操作被执行时触发。

      RunWokerCompleted - 当BackgroundWoker对象的多线程操作完成时触发。

      ProgressChanged - 当BackgroundWorker对象的多线程操作状态改变时触发。

      另外还有一个非常重要的属性WorkerReportsProgress - 如果想让BackgroundWorker对象以异步的方式报告线程实时进度,必须将该属性的值设为true。

      BackgroundWorker对象的ReportProgress方法用于向主线程返回后台线程执行的实时进度。

      下面是子窗体的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ModalProgressDialog
    {
        public partial class Form2 : Form
        {
            public int ProgressValue 
            {
                get { return this.progressBar1.Value; }
                set { progressBar1.Value = value; }
            }
    
            public Form2()
            {
                InitializeComponent();
            }
        }
    }

    子窗体中放置了一个ProgressBar控件,对外可以通过ProgressValue属性来获取和修改进度条的当前值。同时,我们可以将子窗体的FormBorderStyle属性设为FixedDialog以使其看起来更像对话框,然后将MaximizeBoxMinimizeBox都设为false,将ControlBox属性设为false以隐藏窗体关闭按钮。在父窗体中,我们通过BackgroundWorker对象的RunWorkerAsync方法触发DoWork事件,此时CountTheTime()方法被执行。在CountTheTime()方法中,通过ReportProgress()方法从后台进程(父窗体)传递进度指示到主UI线程(子窗体)中,这样同时会触发ProgressChanged事件,然后我们在该事件中更新子窗体的进度条状态

  • 相关阅读:
    java代码--Date类获取当前时间-格式化输出
    Eclipse快速生成do while if 等方法
    java不同包中protected修饰的属性和方法调用方法
    java中如果删除导入的jar包,工程出现叹号解决方案
    Best Reward HDU 3613(回文子串Manacher)
    Teacher YYF
    Period II
    How many
    String Problem
    Corporate Identity
  • 原文地址:https://www.cnblogs.com/wangchuang/p/4483418.html
Copyright © 2011-2022 走看看