C#--BackgroundWorker使用心得

来源:互联网 发布:猫咪 知乎 编辑:程序博客网 时间:2024/05/24 02:06


        BackgroundWorker类允许您在单独的专用线程上运行操作。  耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。


  public partial class Form1 : Form
    {
        BackgroundWorker bgw = new BackgroundWorker();
        public Form1()
        {
            InitializeComponent();
            bgw.WorkerReportsProgress = true;
            bgw.WorkerSupportsCancellation = true;
            bgw.DoWork+=new DoWorkEventHandler(bgw_DoWork);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);

          

        }

        private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lbResult.Text = (e.ProgressPercentage.ToString() + "%" + e.UserState);
        }

        private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                lbResult.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                lbResult.Text = "Error: " + e.Error.Message;
            }
            else
            {
                lbResult.Text = "Done!";
            }
        }

        private void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 12; i++)
            {
                if (bgw.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(500);
                    bgw.ReportProgress(i * 10);
                }
            }
        }

   
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (bgw.IsBusy != true)
            {
                bgw.RunWorkerAsync();
            }
        }
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (bgw.WorkerSupportsCancellation == true)
            {
                bgw.CancelAsync();
            }
        }


1 0